为何IIS的URL Rewrite Maps未更改浏览器URL?如何配置实现跳转?
问题根因
- 你当前配置的
action type="Rewrite"属于服务器端内部重写,整个处理过程仅在IIS内部完成,浏览器不会收到任何跳转通知,因此地址栏不会发生变化。要触发浏览器地址栏更新,必须使用Redirect类型动作返回3xx跳转状态码。 - 现有重写映射的逻辑与需求不匹配:当前配置的逻辑是「请求路径匹配map的key时,内部返回value对应路径的内容」,并没有实现旧地址跳转到友好URL的逻辑。
修正配置方案
你需要根据实际需求调整规则,如果你需要实现「用户访问原始foo.html时,地址栏自动变为友好URL,同时正常返回页面内容」,需要配置两条规则分别处理跳转和内部重写,参考配置如下:
<rule name="原始地址跳转到友好URL" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{TestRedirect:{REQUEST_URI}}" pattern="(.+)" /> </conditions> <!-- redirectType设为Permanent为301永久跳转,对SEO友好;测试阶段可改为Temporary用302临时跳转 --> <action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" /> </rule> <rule name="友好URL映射到实际文件" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{TestRewrite:{REQUEST_URI}}" pattern="(.+)" /> </conditions> <action type="Rewrite" url="{C:1}" appendQueryString="false" /> </rule> <rewriteMaps> <!-- 跳转映射:key为原始文件访问路径,value为对应的友好URL --> <rewriteMap name="TestRedirect" defaultValue=""> <add key="/foo.html" value="/This-Is-A-Nice-Page-To-Remember" /> </rewriteMap> <!-- 重写映射:key为友好URL,value为对应的实际静态文件路径 --> <rewriteMap name="TestRewrite" defaultValue=""> <add key="/This-Is-A-Nice-Page-To-Remember" value="/foo.html" /> </rewriteMap> </rewriteMaps>
注意事项
- 如果不需要兼容旧地址的跳转,仅需要用户访问友好URL时正常返回内容,仅保留第二条
友好URL映射到实际文件的规则即可,直接对外分发友好URL。 - 配置修改完成后,需要重启对应IIS站点或者回收应用池,确保配置生效。
- 浏览器会缓存301永久跳转,测试期间如果配置调整后未生效,可以清除浏览器缓存或者用无痕模式测试。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

