2018年使用RewriteRule匹配网站根目录的有效正则表达式是什么?
2018年匹配根目录请求的有效正则表达式解析
经常逛Stack Overflow的朋友应该都有印象,关于“匹配根目录请求的正则表达式”一直存在不少历史混淆——比如^/$、^$、^/?$这几种写法都被不同的回答提到过。那在2018年,到底哪种才是真正有效的匹配方式呢?
我当时特意用Chrome做了个简单测试:不管输入的URL是纯根路径/,还是带查询参数的/?test,用^$居然都能匹配上,这一开始让我有点困惑,后来结合服务器的请求处理逻辑才搞明白其中的门道。
下面就来拆解这几种常见写法的区别和适用场景:
^/$:这是最严格的写法,只匹配路径为纯/的请求。如果你的URL带了查询参数(比如/?foo=bar),有些服务器会把查询参数和路径分开处理,此时这个正则就匹配不上了——它只认没有任何额外内容的根路径。^$:这个正则匹配的是空字符串。为什么测试里连/?test都能命中?因为很多主流服务器(比如Nginx、Apache)或者Web框架在处理请求时,会把路径部分的/之后的查询参数剥离,甚至有些框架会把根路径直接解析为空字符串。所以当请求是根目录相关的(不管带不带查询参数),对应的路径标识是空字符串,^$自然就能匹配到。^/?$:这是兼容性最好的写法,它同时匹配空字符串和单个/。不管服务器是把根路径解析为/还是空字符串,也不管请求带不带查询参数,这个正则都能准确命中根目录请求。
所以在2018年,如果你要找一个通用且稳妥的匹配根目录请求的正则,**^/?$**是最优选择;如果你的场景只需要严格匹配不带任何查询参数的纯根路径,那^/$更合适;而^$则适合那些明确将根路径解析为空字符串的服务器/框架场景。
内容的提问来源于stack exchange,提问作者DM8
相关产品推荐
相关产品推荐

