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