如果在htaccess for 301中将URL中的特殊字符重定向到另一个字符?

时间:2016-05-15 14:00:31

标签: apache .htaccess redirect url-redirection

规则:仅当%252C+附带,-时,将包含+的所有网址重定向至-并将+重定向至%252C+

例如:http://www.example.com/FortWorth%252C+TX/   致:http://www.example.com/FortWorth,-TX/

例如:http://www.example.com/Fort+Worth%252C+TX/   致:http://www.example.com/Fort-Worth,-TX/

例如:http://www.example.com/Fort+Worth/   致:http://www.example.com/Fort+Worth/       (不应该重定向这个)

注意:请记住,您的代码不应只针对上述网址,而应针对具有上述规则的所有网址。

2 个答案:

答案 0 :(得分:1)

RewriteRule的第一个参数与%-decoded网址匹配,因此应与http://www.example.com/FortWorth%2C+TX/匹配,而不是http://www.example.com/FortWorth%252C+TX/

假设奇怪的子串只出现一次,并且" +"只有在此之前出现一次,您可以使用以下两个规则来执行此操作。如果可能出现多个+,那么事情就会很快变得难看,因为您需要添加更多规则,或者开始递归处理。

RewriteRule ^([^+]+)\+(.+)%2C\+(.*)$ $1-$2,-$3 [R,L]
RewriteRule ^([^+]+)%2C\+(.*)$ $1,-$2 [R,L]

我不确定mod_rewrite是否会将,字符转义为"特殊字符"。它是在URL中使用的有效字符。如果它给您带来问题,您可以使用[NE]标志来防止转义此类字符。

答案 1 :(得分:1)

感谢Sumurai8,为您的解决方案,但它需要像这段代码一样进行修改:

RewriteEngine On

RewriteRule ^([^+]+)\+(.+)%2C+\+(.*)$ /$1-$2,-$3 [R,L]
RewriteRule ^([^+]+)%2C+\+(.*)$ /$1,-$2 [R,L]