用.htaccess替换查询字符串中的空格

时间:2015-03-10 18:32:50

标签: regex apache .htaccess mod-rewrite

我在谷歌有数百个(如果不是数千个)具有产品名称的网址。我的新电子商务现在在构造URL时用连字符替换空格,我需要使用.htaccess通过用连字符替换空格来自动将旧URL重定向到新的URL。

我使用的示例网址是

detalle.php?titulo=Zapatillas%20Salomon%20Xr%20Mission&codigo=040-8800-072

但要替换的空格数量可能差异很大。

我尝试过的最后一次规则是:

RewriteCond %{QUERY_STRING} ^(.*)[\s|%20](.*)&codigo=(.*)
RewriteRule detalle.php detalle.php?%1-%2&codigo=%3 [N=20]

在网上找到的测试人员中,这只替换了最后一个空格,让其他人没有改变,在我的开发服务器中甚至没有。

我已经花了将近一天的时间,而且无处可去,即使根据Apache文档,这应该有效。

提前致谢。

编辑:
@anubhava给出的解决方案

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(.*?)(?:\+|%20|\s)+(.+?)\sHTTP [NC]  
RewriteRule ^ /%1-%2 [L,NE,R=302]  

按照要求工作,但不知何故打破了以前一直工作完美的.htacces中的线条(减去空白)

RewriteCond %{QUERY_STRING} ^titulo=(.*)&codigo=(.*)$
RewriteRule detalle.php http://otherdomain/%1--det--%2? [R=301,L]

这是将带参数的URL转换为"友好"网址。

EDIT2:
  开发服务器中存在某种问题,因为它位于子目录中,我在生产服务器上尝试过,一切正常,所以我接受了答案。   我把这个编辑放在其他人有类似情况的情况下。

1 个答案:

答案 0 :(得分:1)

您可以在根.htaccess中将此规则用作第一个规则,以便通过连字符转换所有空格。

RewriteEngine In

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(.*?)(?:\+|%20|\s)+(.+?)\sHTTP [NC]
RewriteRule ^ /%1-%2 [L,NE,R=302]