Перезапись 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>

person Seb Nilsson    schedule 04.10.2012    source источник
comment
Вы хотите заблокировать перезапись расширений .aspx и .html?   -  person A Developer    schedule 04.10.2012
comment
@RatanSharma Да, это правильно.   -  person Seb Nilsson    schedule 04.10.2012


Ответы (8)


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

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

<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>

Обновление: я писал об этом в блоге подробнее.

person Seb Nilsson    schedule 15.10.2012
comment
Это сработало для меня после установки модуля перезаписи URL: iis.net/downloads/microsoft/url -переписать - person Micah; 18.01.2013
comment
+1 это исправило проблему, которая у меня была в Wordpress (работающем на IIS), когда плагин W3 Total Cache кэшировал пустые страницы, когда отсутствовала косая черта. - person IntricatePixels; 20.04.2013
comment
Почему вы отрицаете matchType=IsDirectory? Разве это не тот случай, когда следует добавить косую черту? - person Alex Czarto; 29.03.2017
comment
@micah Знаете ли вы, почему изображения не загружаются (500), когда применяется это правило? - person Charindu Edirisooriya; 26.06.2019

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

<!-- 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> 
person Giscard Biamby    schedule 10.07.2013
comment
это сработало для меня, спасибо, что сэкономили мое время. :) - person Vishal Sen; 25.05.2018

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

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

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

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

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

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

person Garland Pope    schedule 14.03.2017

            <conditions>
                <add input="{URL}" pattern="(.*)\.(.*)[a-z]$" negate="true" />
                <add input="{URL}" pattern="(.*)\.(.*)[0-9]$" negate="true" />
            </conditions>

кроме .html и .aspx и .woff2

person MyPhuong Tran    schedule 09.11.2019

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

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

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

person Colin Wiseman    schedule 15.01.2013

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

<add input="{REQUEST_METHOD}" matchType="Pattern" pattern="GET" ignoreCase="true" />
person Johan B    schedule 28.07.2019

Вы можете попробовать это:

        <conditions>
            <add input="{URL}" pattern="(.*)\.(.*)$" negate="true" />
        </conditions>
person Community    schedule 10.11.2019
comment
Можете ли вы прокомментировать, почему этот ответ немного работает? Решения всегда принимаются, но знать почему так же важно, как исправление :) - person J. Murray; 10.11.2019