Попробуйте переписать на другой URL, если это приведет к 404

1406
Jeff Mercado

У меня есть локальный сервер Tomcat, который я разрабатываю для использования моего локального экземпляра IIS в качестве прокси.

Я делаю это потому, что развертывание сервера является болезненным процессом, так как большая часть контента не является (что я бы описал как) автономной. Контент из разных проектов по существу копируется в корень сервера. Я не хотел иметь дело с такой сложностью его настройки, поэтому с помощью модуля перезаписи я мог переписывать URL-адреса в виртуальные каталоги по большей части.

например,

/js/* -> /someproject/js/* /css/* -> /someproject/css/* /**/*.pdf -> /someotherproject/pdf/* 

Тем не менее, есть несколько случаев, когда эта схема не работает, особенно когда в каталогах назначения есть совпадение. При развертывании некоторые ресурсы размещаются в одном и том же каталоге, поэтому нет никакого реального способа определить, какой именно. В этих файлах нет строгой закономерности, все смешанное.

например,

/someproject1/file1.txt -> /file1.txt /someproject2/book2.doc -> /book2.doc 

Поэтому, учитывая URL /file1.txt, я не знаю, смогу ли я переписать, чтобы перейти к someproject1или someproject2. Так что я думаю, я мог бы заставить это работать, если бы была какая-то иерархия того, к чему URL пытаться переписать. Так что я мог бы взять URL-адрес, например /file3.txt, переписать на первый из этих шаблонов, который кажется действительным.

/someproject1/file3.txt # if 404, try the next /someproject2/file3.txt # if 404, try the next /someotherproject/file3.txt # if 404, try the next /file3.txt # fallback 

Это можно выразить только с помощью модуля перезаписи URL?

0
Задумывались ли вы об использовании ссылок, чтобы один и тот же файл появлялся во всех соответствующих каталогах проекта? AFH 8 лет назад 0
Возможно, хотя я не знаю, сработает ли это для моего сценария. Если бы был способ заставить один каталог ссылаться на несколько каталогов, я бы это сделал. Но AFAIK, это не работает таким образом. Если бы это было возможно, я бы тоже это принял. Jeff Mercado 8 лет назад 0
Прошло много лет с тех пор, как я использовал IIS, и у меня нет тестовой версии, но я считаю, что, как и другие веб-серверы, которые я использовал, можно определить псевдоним, указывающий на любой каталог, без ограничений на несколько ссылок. в тот же каталог. Фактически, я использую это для прописных букв, например, `http: // / music` и` http: // / Music` оба указывают на один и тот же `: \ \ SharedMusic`. AFH 8 лет назад 0
Для моей ситуации мне нужно было бы пойти другим путем. То, что вы описываете, я могу сделать, несколько виртуальных путей могут указывать на один физический путь. Но в идеале мне нужно несколько физических путей к одному виртуальному пути. Насколько я знаю, это невозможно. Jeff Mercado 8 лет назад 0
Лучшее, что вы можете сделать, это создать каталог ссылок: вы можете создать его на лету и периодически запускать задание. Используйте команду типа `for / r% i в (*. *) Do mklink / h" \% ~ nxi ""% i "` (удваивая `%` в пакетном файле). Сначала вам нужно очистить каталог `` с помощью `del \ *. *`. Вы можете попробовать создать символические ссылки (опустите `/ h`), но я не уверен, что IIS будет обрабатывать их правильно. AFH 8 лет назад 0

1 ответ на вопрос

0
Jeff Mercado

Я смог заставить это работать.

Первым препятствием было то, что я не осознавал, что не все типы условных совпадений доступны в глобальной области (именно там я и писал свои правила). Только Patternбыло доступно. Мне пришлось изменить область на «распределенную» область (правила для сайта), чтобы получить доступ к типам IsFileи IsDirectoryсоответствию.

Тогда я мог бы написать свои правила с какой-то иерархией. Сначала переписать, чтобы соответствовать шаблону, который я хочу попробовать сначала, затем, если он не разрешается в файл, переписать его на следующий шаблон и повторить.

<rule name="try in project/content" stopProcessing="false"> <match url=".*" /> <action type="Rewrite" url="project/content/" /> </rule> <rule name="verify project/content" stopProcessing="false"> <match url="(project)/content(/.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="" /> </rule> 

В моем конкретном случае я хотел сначала попробовать конкретный подкаталог, а затем попробовать родительские каталоги, если они не существуют. Но теоретически я мог бы сделать это для любого набора путей, если я знаю, в каком порядке их пробовать.


Так что для моего примера в вопросе я бы установил эти правила:

<rule name="try in someproject1" stopProcessing="false"> <match url=".*" /> <action type="Rewrite" url="someproject1/" /> </rule> <rule name="try in someproject2 otherwise" stopProcessing="false"> <match url="someproject1/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="someproject2/" /> </rule> <rule name="try in someotherproject otherwise" stopProcessing="false"> <match url="someproject2/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="someotherproject/" /> </rule> <rule name="fallback to root otherwise" stopProcessing="false"> <match url="someotherproject/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="" /> </rule> 

Похожие вопросы