Iis URL重写规则似乎是重定向而不是重写
我正在使用IIS URL重写2.0模块创建一个URL,该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是
这样做的目的是,如果某些内容转到/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>