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

使用mod_rewrite/rewrite map处理含空格URL的404问题求助

解决带空格URL的RewriteMap跳转404问题

问题核心是Apache自动编码了%{REQUEST_URI}里的空格:当用户请求带空格的URL时,%{REQUEST_URI}中的空格会被转成%20,但你的映射表键用的是实际空格,两者无法匹配,导致找不到对应跳转项,最终返回404。

给你两个可行的解决办法:

办法一:修改映射表的键为编码后的格式

把映射表里带空格的键,将空格替换成%20,比如原来的映射项:

"redirects.example.com/confluence/display/ADS/New Tech Tip - Pidgin Settings" newsite.vendor.com/wiki/spaces/ADS/blog/2011/10/12/8487166/New+Tech+Tip+-+Pidgin+Settings

改成:

"redirects.example.com/confluence/display/ADS/New%20Tech%20Tip%20-%20Pidgin%20Settings" newsite.vendor.com/wiki/spaces/ADS/blog/2011/10/12/8487166/New+Tech+Tip+-+Pidgin+Settings

这样%{REQUEST_URI}的编码值就能和键完全匹配。

办法二:用%{THE_REQUEST}获取原始未编码路径

如果不想修改大量映射表,可以调整Apache配置,用%{THE_REQUEST}提取原始请求路径(这里的空格是未编码的,和你映射表的键一致):

RewriteMap redirects /confs/redirects.example.com/URLs
# 从THE_REQUEST中提取主机+原始未编码路径
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(/[^?\s]+)
RewriteCond ${redirects:%{HTTP_HOST}%1} ^.+$
RewriteRule .* https://${redirects:%{HTTP_HOST}%1} [redirect=temporary,last,qsdiscard]

解释下:%{THE_REQUEST}的格式是GET /path with spaces HTTP/1.1,正则^[A-Z]+\s(/[^?\s]+)会提取出/path with spaces(也就是%1),这个值里的空格和你映射表的键完全一致,就能正确匹配跳转。

你可以通过错误日志验证:如果之前${redirects:%{HTTP_HOST}%{REQUEST_URI}}输出为空,说明没匹配上,用办法二后应该能看到对应跳转值。

内容的提问来源于stack exchange,提问作者Thaylin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:10