Назад | Перейти на главную страницу

IIS 7 URL-адрес перезаписывается, только если нет файла, подкаталога или строки запроса

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

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

т.е. мне нужны только запросы на TheSite.net переписать / перенаправить на TheSite.net/home.htm, но запросы на TheSite.net/FAQ.htm или TheSite.net/sub или TheSite.net/?parameter=yep не переписываться / не перенаправляться.

Я получил перезаписи и перенаправления для работы, например:

<system.webServer>
    <rewrite>
      <rules>
        <clear />
        <rule name="Rewrite home page to Home.htm" stopProcessing="true">
          <match url="^" />
          <action type="Rewrite" url="/Home.htm" />
        </rule>
      </rules>
    </rewrite>
</system.webServer>

Я тоже пробовал <match url="^$" /> и <match url="TheSite.net" />, но они, естественно, тоже переписывают TheSite.net/?parameter=yep, а мне нужно, чтобы этого не было. Возможно, если есть еще один атрибут <match> что позволяет мне сопоставить пустую строку запроса, но нет, если есть строка запроса (или не соответствует, если есть что-то после косой черты)?

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

На этом сайте я вижу Параметры строки запроса модуля перезаписи URL-адресов IIS похоже, что это может быть что-то вроде того, что могло бы сработать, хотя я хочу противоположное - перезаписывать только в том случае, если после имени домена в URL-адресе нет строки запроса или другого контента.

Хорошо, при условии полного тестирования странных случаев, я, кажется, нашел решение, играя с Условиями, а именно:

<rule name="Rewrite home page to Home.htm" stopProcessing="true">
  <match url="^$" />
  <conditions>
    <add input="{QUERY_STRING}" pattern=".+=(.+)" negate="true" />
  </conditions>
  <action type="Rewrite" url="/Home.htm" />
</rule>