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

Iis URL重写规则似乎是重定向而不是重写,iis,url-rewriting,url-redirection,url-rewrite-module,Iis,Url Rewriting,Url Redirection,Url Rewrite Module,我正在使用IIS URL重写2.0模块创建一个URL,该URL始终指向我的应用程序的最新版本。我将其配置如下: 这样做的目的是,如果某些内容转到/latest/*,那么所有URL都将重写为/1.1/*。例如,/latest/index.html应该变成/1.1/index.html 当我请求一个文件时,这会起作用,例如: /latest/index.html - works /latest/js/app.js - works 但是,这不起作用: /latest 由于index.html是

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


这样做的目的是,如果某些内容转到
/latest/*
,那么所有URL都将重写为
/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
http:///latest
然后按ENTER键,它将更改为:

http://<domain>/1.1
http:///1.1

好像被重定向了。它仍然可以工作,但我不想更改URL(因此我使用
重写
而不是
重定向
)。知道为什么吗?我的规则有问题吗?

这可能是您遇到的问题:

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

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


也许有一种更优雅的方式,它能做到罐头上写的


您可能需要硬重新加载页面,因为浏览器可能会缓存重定向,您可以始终在“匿名模式”下进行测试,该模式不会在会话之间保存永久重定向。

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


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



谢谢,除了index.html中引用的所有资源似乎是从错误的URL加载外,它似乎在一定程度上起作用。例如,如果我转到/latest,那么a将请求“~/js/app.js”,而不是“~/latest/js/app.js”。虽然,我认为这是意料之中的,因为它会考虑“最新”的文件而不是路径……忽视前面的评论-我想沙尔曼A解释和解决了这一点。是的,你是对的。我已经把这个和Kev的答案一起包括进去了,现在它的表现是我想要的。谢谢
<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>