使用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
相关产品推荐
相关产品推荐

