
У меня есть локальный сервер 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?
решение1
Мне удалось заставить это работать.
Первым препятствием было то, что я не осознавал, что не все типы условных соответствий доступны в глобальной области действия (где я писал свои правила). Pattern
Доступен был только . Мне пришлось изменить область действия на «распределенную» (правила на сайт), чтобы получить доступ к типам соответствий IsFile
и .IsDirectory
Затем оттуда я мог бы написать свои правила с какой-то иерархией. Сначала переписать, чтобы они соответствовали шаблону, который я хочу попробовать первым, затем, если он не разрешается в файл, переписать его в следующий шаблон и повторить.
<rule name="try in project/content" stopProcessing="false">
<match url=".*" />
<action type="Rewrite" url="project/content/{R:0}" />
</rule>
<rule name="verify project/content" stopProcessing="false">
<match url="(project)/content(/.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}{R:2}" />
</rule>
В моем конкретном случае я хотел сначала попробовать определенный подкаталог, а затем родительские каталоги, если их не было. Но теоретически я мог бы сделать это для любого набора путей, если бы я знал, в каком порядке их пробовать.
Итак, для моего примера в вопросе я бы установил следующие правила:
<rule name="try in someproject1" stopProcessing="false">
<match url=".*" />
<action type="Rewrite" url="someproject1/{R:0}" />
</rule>
<rule name="try in someproject2 otherwise" stopProcessing="false">
<match url="someproject1/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="someproject2/{R:1}" />
</rule>
<rule name="try in someotherproject otherwise" stopProcessing="false">
<match url="someproject2/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="someotherproject/{R:1}" />
</rule>
<rule name="fallback to root otherwise" stopProcessing="false">
<match url="someotherproject/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}" />
</rule>