URL-адрес URL-адреса IIS: добавьте конечную косую черту, за исключением .html и .aspx

Добавление конечной косой черты ко всем URL-адресам через модуль перезаписи URL-адреса IIS широко распространен, но как я могу добавлять исключения для URL-адресов, которые заканчиваются на .html и .aspx?

Сегодня у меня есть это:

<rule name="Add trailing slash" stopProcessing="true">
  <match url="(.*[^/])$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <!-- Doesn't seem to be working -->
    <!--<add input="{REQUEST_URI}" pattern="(.*?).html$" negate="true" />-->
    <!--<add input="{REQUEST_URI}" pattern="(.*?).aspx$" negate="true" />-->
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule>

Ответы

Ответ 1

Если вы хотите, чтобы что-то было сделано правильно, вы должны сделать это сами, очевидно...

Вот решение моего вопроса:

<rule name="Add trailing slash" stopProcessing="true">
  <match url="(.*[^/])$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <add input="{REQUEST_FILENAME}" pattern="(.*?)\.html$" negate="true" />
    <add input="{REQUEST_FILENAME}" pattern="(.*?)\.aspx$" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule>

Обновить: Я подробно об этом писал.

Ответ 2

Изменяя другие ответы, я использовал это, поэтому мне не нужно было бы указывать список расширений файлов:

<!-- Ensure trailing slash -->
<rule name="Add trailing slash" stopProcessing="true">
  <match url="(.*[^/])$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <add input="{REQUEST_FILENAME}" pattern="(.*?)\.[a-zA-Z]{1,4}$" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule> 

Ответ 3

Мы добавляем несколько расширений следующим образом:

<add input="{URL}" negate="true" pattern="((.+).(jpg|ico|gif|js|png|htm|css|html))" ignoreCase="true" />

Ответ 4

Чтобы предотвратить добавление косой черты всех файлов, я изменил правило соответствия на это:

<match url="^([^.]*[^/])$" />

Это правило применяется только к путям, которые включают любое количество неточечных символов, которое не заканчивается косой чертой. Таким образом, любой путь, который включает точку (например, xxx.html, xxx.aspx и т.д.), Будет исключен без какого-либо дополнительного правила отрицания.

Поиск наличия точки в правиле совпадения позволил мне полностью удалить правила условий, которые используют типы соответствия IsFile и IsDirectory. Эти типы соответствия разрешены только в распределенных правилах (web.config), а не в глобальных правилах (applicationHost.config), поэтому я был вынужден реплицировать это правило для каждого сайта, а не применять его ко всем сайтам с использованием глобального правила. Изменив регулярное выражение в правиле соответствия, чтобы исключить файлы и удалить условия IsFile и IsDirectory, мне удалось создать глобальное правило вместо нескольких распределенных правил.

Ответ 5

Это почти сработало для меня. Мне пришлось изменить его на

<add input="{URL}" pattern="(.*?)\.html$" negate="true" />
<add input="{URL}" pattern="(.*?)\.aspx$" negate="true" />

В противном случае спасибо за это!

Ответ 6

Для предотвращения ошибочного превращения вызовов POST, DELETE и других методов REST без завершающего слеша в запрос GET при перенаправлении рассмотрите возможность добавления следующего условия:

<add input="{REQUEST_METHOD}" matchType="Pattern" pattern="GET" ignoreCase="true" />