URL重写规则似乎是重定向而不是重写

时间:2015-04-29 16:52:22

标签: iis url-rewriting url-redirection url-rewrite-module

我正在使用IIS URL Rewrite 2.0模块创建一个始终指向我的应用程序的最新版本的URL。我已将其配置如下:

<rule name="Latest" stopProcessing="true">
    <match url="^latest(.*)" />
    <action type="Rewrite" url="1.1{R:1}" />
</rule>

目的是如果某些内容转到/latest/*,则所有网址都会重写为/1.1/*。例如,/latest/index.html应该变为/1.1/index.html

当我请求文件时,这是有效的,例如:

/latest/index.html - works
/latest/js/app.js - works

然而,这不起作用:

/latest

由于index.html是默认文档,我希望这会重写为/1.1/index.html,但事实上它似乎会执行重定向。例如,如果我在浏览器地址栏中键入以下内容:

http://<domain>/latest

然后按ENTER键,它变为:

http://<domain>/1.1

就像重定向一样。它仍然有效,但我不希望更改URL(因此我使用Rewrite而不是Redirect)。知道为什么吗?我的规则有什么不对吗?

2 个答案:

答案 0 :(得分:2)

当您请求网址/latest时,您的规则会将其重写为/1.1。由于/1.1与现有目录而不是文件匹配,因此IIS会使用礼貌重定向as described here进行响应。 IIS使用重写的URL,因为它无法看到原始URL。

我建议您通过规则模拟相同的行为,而不是通过两个网址/latest/latest/提供相同的内容。如果请求的网址为/latest,则应首先重定向到/latest/,然后重写:

<rule name="Latest: force trailing slash" stopProcessing="true">
    <match url="^latest$" />
    <action type="Redirect" url="latest/" redirectType="Found" />
</rule>
<rule name="Latest: rewrite" stopProcessing="true">
    <match url="^latest/(.*)" />
    <action type="Rewrite" url="1.1/{R:1}" />
</rule>

答案 1 :(得分:1)

这可能是您遇到的问题:

  

IIS generates courtesy redirect when folder without trailing slash is requested

(虽然那篇文章是关于IIS6的,但IIS7 +的行为方式相同,似乎你无法禁用此行为。)

在仅与/latest匹配的现有规则之前添加规则(无尾部斜杠):

<rewrite>
    <rules>
        <rule name="Latest1" stopProcessing="true">
            <match url="^latest$" />
            <action type="Rewrite" url="1.1/" />
        </rule>
        <rule name="Latest2" stopProcessing="true">
            <match url="^latest(.*)" />
            <action type="Rewrite" url="1.1{R:1}" />
        </rule>
    </rules>
</rewrite>

这可能是一种更优雅的方式,就像它在锡上所说的一样。

您可能需要重新加载页面,因为您的浏览器可能会缓存重定向,您可以随时在&#34;隐身模式下测试&#34;从不在会话之间保存永久重定向。