使用 mod_rewrite/rewrite 地图和带有空格的 url 出现问题

问题描述 投票:0回答:1

我们正在从服务器产品转向云产品,不幸的是他们正在更改我们的 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。任何帮助将不胜感激。

apache mod-rewrite url-rewriting
1个回答
0
投票

问题是空格是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(永久)重定向。

© www.soinside.com 2019 - 2024. All rights reserved.