我们正在从服务器产品转向云产品,不幸的是他们正在更改我们的 URL。为了帮助缓解新位置中特定项目的链接问题,我生成了所有 URL 的映射。虽然其中不带空格的可以工作,但是带空格的却不能,我最终会收到 404 消息
这是我的 httpd.conf 中的代码
RewriteCond ${redirects:%{HTTP_HOST}%{REQUEST_URI}} ^.+$
RewriteMap redirects /confs/redirects.example.com/URLs
RewriteRule .* https://${redirects:%{HTTP_HOST}%{REQUEST_URI}} [redirect=temporary,last,qsdiscard]
这是映射的示例
"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
如您所见,我尝试将其封装在 " 中,并使用 \ 转义空格并将空格转换为 %20,正如我在其他帖子中看到的那样,但似乎没有任何效果。
当错误日志给我 404 消息时,我可以看到空格被编码为 %20。任何帮助将不胜感激。
问题是空格是TXT映射类型文件中的分隔符,我不相信有办法转义映射文件本身中的文字空格。
文字空格在 HTTP 请求中被编码为
%20
(它们必须如此才能形成有效的 HTTP 请求),但 REQUEST_URI
服务器变量已进行 % 解码。因此,您尝试使用带有文字空格的字符串来执行查找,但这将失败。
解决方案是将 % 编码的 URL 存储在 TXT 映射文件中(即 spaces 编码为
%20
),并使用 % 编码的 URL 路径进行查找。我们可以从 THE_REQUEST
服务器变量中提取 % 编码的 URL。
因此,地图文件应如下所示:
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
RewriteCond ${redirects:%{HTTP_HOST}%{REQUEST_URI}} ^.+$
RewriteMap redirects /confs/redirects.example.com/URLs
RewriteRule .* https://${redirects:%{HTTP_HOST}%{REQUEST_URI}} [redirect=temporary,last,qsdiscard]
请注意,
RewriteMap
指令本身不是RewriteRule
/ RewriteCond
规则的一部分。您似乎已将其夹在规则本身中(它可能“有效”,但不正确)。另外,您没有声明地图类型。
尝试以下方法:
RewriteMap redirects "txt:/confs/redirects.example.com/URLs"
RewriteCond %{THE_REQUEST} \s(/[^?\s]*)
RewriteCond ${redirects:%{HTTP_HOST}%1} (.+)
RewriteRule .* https://%1 [R=302,L,QSD]
第一个 condition(
RewriteCond
指令)从 THE_REQUEST
服务器变量捕获%编码的 URL 路径。 (THE_REQUEST
包含 HTTP 请求标头的第一行,并包含 GET /url?query HTTP/1.1
形式的字符串。)
然后,使用 %1
反向引用,在第二个
条件中使用捕获的%编码 URL 路径。
重写映射查找的结果也会在第二个
条件的
%1
反向引用(覆盖较早的反向引用)中捕获。然后在 substitution 字符串中使用它 - 无需再次调用重写映射。
我使用了速记标志,但这只是个人喜好。显然,一旦您确认它按预期工作,这最终应该是 301(永久)重定向。