如何重定向路径中间含非查询字符串类型?的URL?
处理路径中包含
?的URL重定向 问题原因
Apache默认将?视为请求路径与查询字符串的分隔符,所以你目标URL里的/?/jobs/会被解析为:路径是/michigan/jobs/,查询字符串是/jobs/。之前的规则都是在匹配路径部分,自然无法命中包含?的完整请求。
正确重写规则(基于mod_rewrite)
必须借助%{THE_REQUEST}变量——它记录了客户端发送的完整请求行(比如GET /michigan/jobs/?/jobs/ HTTP/1.1),能完整保留原始URL中的?作为路径的一部分。
在.htaccess文件中添加以下规则:
RewriteEngine On # 匹配包含/?/jobs/的原始请求 RewriteCond %{THE_REQUEST} ^GET\ /michigan/jobs/\?/jobs/ [NC] # 重定向到目标路径 RewriteRule ^michigan/jobs/ /michigan/jobs/ [R=301,L]
规则细节解释
RewriteCond %{THE_REQUEST} ^GET\ /michigan/jobs/\?/jobs/ [NC]:^GET\:匹配GET请求(如需支持POST可调整,但重定向一般用GET)\?:转义正则中的特殊字符?,确保匹配路径里的问号[NC]:不区分大小写,兼容大小写不同的请求
RewriteRule ^michigan/jobs/ /michigan/jobs/ [R=301,L]:R=301:永久重定向(如果只是临时测试,可改为R=302)L:标记为最后一条规则,避免后续规则干扰
为什么之前的规则失效?
- Redirect/RedirectMatch(mod_alias):这类规则自动拆分路径与查询字符串,无法识别路径中的
?,只会匹配/michigan/jobs/路径+/jobs/查询字符串的组合,和你的目标请求不匹配。 - 普通RewriteRule:默认仅匹配请求的路径部分(不包含查询字符串),所以
^/michigan/jobs/?/jobs/$实际是在匹配路径/michigan/jobs/后的内容,而?已经被解析为查询分隔符,路径部分到/michigan/jobs/就结束了,自然无法命中。
内容的提问来源于stack exchange,提问作者ByteMyPixel
相关产品推荐
相关产品推荐

