如何在IIS中配置重写规则隐藏URL中的文件名?
IIS重写规则修正方案
你的规则存在几个关键问题,导致无法实现需求,以下是修正后的规则及问题说明:
原规则的问题
- 条件逻辑错误:当前条件设置
negate="false",意味着只有当请求是存在的文件或目录时才触发规则,但我们需要的是针对根目录后的文件名(非目录)进行处理,逻辑完全相反。 - Action路径错误:原规则中
action的url写成了url="/",这会导致重写路径无效,正确格式应为直接指定目标路径"/"。 - 匹配范围过宽:
match url="(.*)"会匹配包括根目录在内的所有路径,容易引发循环重写。
正确的重写规则(内部跳转,地址栏不变)
如果需要保持地址栏显示原URL(如login.html),但实际内部跳转到根目录,使用以下规则:
<rule name="HideFileName" stopProcessing="true"> <!-- 匹配根目录后非空的任意路径 --> <match url="^(.+)$" /> <conditions logicalGrouping="MatchAll"> <!-- 排除请求为目录的情况 --> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <!-- 可选:仅针对存在的文件,取消注释即可 --> <!-- <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="false" /> --> </conditions> <!-- 重写到网站根目录 --> <action type="Rewrite" url="/" /> </rule>
正确的重定向规则(地址栏改为根目录)
如果需要地址栏直接显示根目录(如http://example.com/),使用重定向规则:
<rule name="RedirectToRoot" stopProcessing="true"> <match url="^(.+)$" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <!-- 可选:仅针对存在的文件,取消注释即可 --> <!-- <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="false" /> --> </conditions> <!-- 永久重定向到根目录,可改为Temporary临时重定向 --> <action type="Redirect" url="/" redirectType="Permanent" /> </rule>
规则说明
match url="^(.+)$":仅匹配根目录后包含至少一个字符的路径,避免匹配根目录本身,防止循环重写。IsDirectory negate="true":排除请求为目录的情况(如http://example.com/test/这类路径不会触发规则)。stopProcessing="true":触发此规则后停止处理后续规则,避免规则冲突。- 若仅需处理存在的文件,取消
IsFile条件的注释即可。
内容的提问来源于stack exchange,提问作者José Marcelino Menezes
相关产品推荐
相关产品推荐

