我正在使用IIS URL重写模块通过重写地图和重写规则(不是重定向)来屏蔽带有友好URL的内部URL。这是我的重写地图:
<rewriteMap name="HashTest">
<add key="/nohash" value="/nohash.aspx" />
<add key="/hash1" value="/hashtest.aspx#hash1" />
</rewriteMap>
这是我的重写规则:
<rule name="Rewrite rule1 for HashTest">
<match url=".*" />
<conditions>
<add input="{HashTest:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" />
</rule>
这适用于没有主题标签的网址,所以每当我查询 www.mysite.com/nohash 时,它会向我显示来自 www.mysite.com/nohash.aspx的内容我们更改了浏览器上的URL。
现在,当我尝试重写为包含主题标签的网址时出现404错误,例如 www.mysite.com/hash1 应该只显示来自 /hashtest.aspx的内容#hash1 但我得到的是404。
现在,如果我将规则操作类型更改为重定向,它确实会成功进行重定向,因此我不知道为什么它不能用于重写。
我知道在请求中没有将hashtags发送到服务器,但如果我的重写映射是向后的,就像<add key="/hashtest.aspx#hash1" value="/hash1" />
一样。
有关为什么重定向与hastags一起工作但重写不对的任何见解?我没有与IIS重定向结合,如果你有另一个模块或方法,我可以使用它非常受欢迎
答案 0 :(得分:7)
散列符号后面的部分(官方称为片段标识符)是URL的仅客户端部分。它永远不会发送到服务器。这就是为什么它不能用于重写但仅用于重定向。重写规则将匹配,但IIS实际上会尝试打开名为hashtest.aspx#hash1
的文件(即扩展名为.asp#hash1
的文件)。此文件不会作为普通ASP页面处理,因为扩展名未链接到ASP.NET。而且很可能它的内容根本不会显示,因为IIS默认配置为仅允许对已知扩展的请求。