如何将Web.config的URL重写规则从(u/username)改为(/username)(类似Instagram的/username格式)
如何将Web.config的URL重写规则从(u/username)改为(/username)(类似Instagram的/username格式)
嘿,我来帮你搞定这个URL重写的问题!你想要把/u/username改成直接/username的格式,其实只需要调整一下你web.config里的重写规则顺序和内容就行,具体操作如下:
首先得搞清楚一个关键点:IIS的URL重写规则是从上到下依次匹配的,所以咱们得把用户资料的规则放在最前面,不然会被后面的通用规则抢先匹配,导致直接访问/username时不会跳转到用户页面。
另外还要注意:不能让这个新规则影响到静态资源(比如图片、CSS、JS)或者你已有的固定页面(比如/login、/about),所以得加个条件过滤掉这些情况。
给你修改好的web.config重写规则:
<rewrite> <rules> <!-- 优先匹配用户资料路径:/username --> <rule name="Profile Rewrite" stopProcessing="true"> <match url="^([a-zA-Z0-9_-]+)(|/)$" ignoreCase="false" /> <!-- 条件:只在请求的不是实际文件/目录时生效,避免影响静态资源 --> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <!-- 可选:如果有固定页面不想被当作用户名,比如/login、/about,取消注释并添加 --> <!-- <add input="{R:1}" pattern="^(login|about|contact)$" negate="true" /> --> </conditions> <action type="Rewrite" url="/index.php?url=profile&username={R:1}" appendQueryString="false" /> </rule> <!-- 通用路由规则:处理其他所有路径 --> <rule name="General Rewrite"> <match url="^(.*)$" ignoreCase="false" /> <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="false" /> </rule> </rules> </rewrite>
我给你拆解一下修改的地方:
- 把用户资料的规则移到了最顶部,并且加上了
stopProcessing="true",意思是只要匹配到这个规则,就不再执行后面的规则了 - 修改了
<match url>的内容,去掉了前面的u/,直接匹配/username格式的路径 - 添加了
<conditions>节点,用来排除实际存在的文件和目录,这样像/css/style.css或者/images/avatar.jpg这类静态资源就不会被误判成用户名了 - 注释掉的部分是给你留的扩展项,如果有固定页面不想被当作用户名,把它们加到
pattern里用竖线分隔就行
最后记得修改完web.config后,重启一下IIS或者对应的应用池,然后测试一下:
- 访问
/你的用户名,看看是不是正确跳转到用户资料页面 - 检查静态资源和其他固定页面能不能正常打开
备注:内容来源于stack exchange,提问作者LuckyBunny
相关产品推荐
相关产品推荐

