You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重定向路径中间含非查询字符串类型?的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:15:24