我正在使用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
)。知道为什么吗?我的规则有什么不对吗?
答案 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;从不在会话之间保存永久重定向。