21

通过 IIS URL 重写模块向所有 URL 添加尾部斜杠已广泛传播,但是如何为以 .html 和 .aspx 结尾的 URL 添加例外

今天我有这个:

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

8 回答 8

27

如果你想把事情做好,你必须自己做,很明显......

这是我的问题的解决方案:

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

更新我在博客上对此进行了更详细的介绍

于 2012-10-15T10:08:24.317 回答
17

改变其他答案,我使用了这个,所以我不必指定文件扩展名列表:

<!-- 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> 
于 2013-07-10T23:56:41.887 回答
3

我们像这样添加多个扩展:

<add input="{URL}" negate="true" pattern="((.+).(jpg|ico|gif|js|png|htm|css|html))" ignoreCase="true" />
于 2013-06-12T18:21:02.717 回答
1

为了防止所有文件都添加斜线,我将匹配规则更改为:

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

这仅适用于包含不以斜杠结尾的任意数量的非点字符的路径。因此,任何包含点的路径(例如 xxx.html、xxx.aspx 等)都将被排除在外,而无需任何额外的否定规则。

查找匹配规则中是否存在点允许我完全删除使用匹配类型 IsFile 和 IsDirectory 的条件规则。这些匹配类型只允许在分布式规则 (web.config) 中,而不是在全局规则 (applicationHost.config) 中,因此我被迫为每个站点复制此规则,而不是使用全局规则将其应用于所有站点。通过修改匹配规则中的正则表达式以排除文件并删除 IsFile 和 IsDirectory 条件,我能够创建一个全局规则,而不是拥有多个分布式规则。

于 2017-03-14T19:06:07.990 回答
1
            <conditions>
                <add input="{URL}" pattern="(.*)\.(.*)[a-z]$" negate="true" />
                <add input="{URL}" pattern="(.*)\.(.*)[0-9]$" negate="true" />
            </conditions>

.html 和 .aspx 和 .woff2 除外

于 2019-11-09T05:55:50.650 回答
0

这几乎对我有用。我不得不把它改成

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

否则,谢谢!

于 2013-01-15T13:30:52.963 回答
0

为了防止 POST、DELETE 和其他没有尾部斜杠的 REST 方法调用通过重定向错误地变为 GET 请求,请考虑添加以下条件:

<add input="{REQUEST_METHOD}" matchType="Pattern" pattern="GET" ignoreCase="true" />
于 2019-07-28T11:23:12.690 回答
0

你可以试试这个:

        <conditions>
            <add input="{URL}" pattern="(.*)\.(.*)$" negate="true" />
        </conditions>
于 2019-11-10T13:35:40.750 回答