首页 > 解决方案 > URL 编码文本与 htaccess QUERY_STRING 不匹配

问题描述

我的网站使用逗号分隔参数中的一些坐标,例如?coords=38.88,-77.03. 我现在发现问题,是 url 保留字符。该问题似乎仅限于链接与 Facebook 共享并且 Facebook 将其更改为?coords=38.88%2C-77.03.

从长远来看,我想修复它,但我需要对已共享的现有链接进行临时修复。如果人们要单击 Facebook 上的链接,我想要一个 .htaccess 规则将其更改为使用逗号。

当逗号后面有空格时,我已经有了类似的规则:

RewriteCond %{QUERY_STRING} (.*coords=-?\d{1,2}(?:\.\d+)?),(?:\s+|\%20|\+)(-?\d{1,3}(?:\.\d+)?,?.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1,%2 [L,NE,R=301]

我尝试将其更改为:

RewriteCond %{QUERY_STRING} (.*coords=-?\d{1,2}(?:\.\d+)?)(,|\%2C)(?:\s+|\%20|\+)(-?\d{1,3}(?:\.\d+)?,?.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1,%3 [L,NE,R=301]

我清除了我的缓存,甚至尝试将坐标编号更改为新的,但我无法让它重定向。我做错了什么,我该如何解决?

标签: regexapache.htaccessmod-rewrite

解决方案


您之前的非捕获组不是可选的,因此它在匹配%2C和失败后尝试匹配 1+ 个空格。您可以使用此规则:

RewriteCond %{QUERY_STRING} (.*coords=-?\d{1,2}(?:\.\d+)?)(?:[+\s]+|\%2C|\%20)+(-?\d{1,3}(?:\.\d+)?,?.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1,%2 [L,NE,R=301]

推荐阅读