У меня есть локальный сервер 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 ответ1

0

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

Первым препятствием было то, что я не осознавал, что не все типы условных совпадений доступны в глобальной области (именно там я и писал свои правила). Только 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .