需要使用Dashes替换URL中未知数量的Spaces

时间:2011-10-18 18:04:28

标签: apache .htaccess mod-rewrite url-rewriting spaces

需要检查一系列空格并将其转换为htaccess中的破折号。 有一些不同的坏网址,我正在重定向,目前它们工作正常,如果标签是一个单词...如果有一个空格404它与/ word1%20word2应该是/word1-word2.

现在......那说 - 并不总是只有一个空间......有时会有2个,但就我在G.webmaster工具冲突中看到的情况而言可能达到6个。

我当前的重写适用于下面的网址序列。

RewriteRule ^.+\(offset\)/+.*?/\(tag\)/([^.]+)$ /tag/$1 [R=301,L]

适用于:www.domain.com/index.php/Blog/(offset)/ 48 /(tag)/ word1

适用于:www.domain.com/Blog/(偏移)/ 328 /(标签)/ word1

适用于:www.domain.com/Tags/(偏移)/ 24 /(标签)/ word1

不起作用:www.domain.com/index.php/Blog/(offset)/ 48 /(tag)/ word1%20word2%20word3

不起作用:www.domain.com/Blog/(offset)/ 328 /(tag)/ word1%20word2

不适用于:www.domain.com/Tags/(offset)/24/(tag)/word1%20word2

SOO ......我在试图弄清楚如何捕捉一组未知空间并用破折号替换它们。 HALP!

2 个答案:

答案 0 :(得分:0)

我不太确定是否可以匹配未知数量的空格并替换然后只使用mod_rewrite。

所以一个解决方案是将内部重定向(没有R)转换为简单的PHP,将空格分隔的值作为参数传递给PHP脚本,在PHP代码中进行必要的替换,然后让PHP发送外部重定向到更正的URL(通过设置标题位置:/ new-url),类似的方法被描述为here

如果您正在寻找纯粹的.htaccess / mod_rewrite解决方案,那么您可以从这开始:

RewriteRule ^temprewrite/([\S]+)$ /tag/$1  [R=301,L]
RewriteRule ^temprewrite/(.*?)\s(.*) /temprewrite/$1-$2
RewriteRule ^.+\(offset\)/\d+/\(tag\)/(.*) /temprewrite/$1
  • 第三行通过提取以空格分隔的标记来进行预处理。它会在内部重写,并匹配第一个或第二个规则。
  • 如果找不到[\S]+匹配的空格,则第一条规则会执行最终重定向。
  • 第二个规则将临时值拆分为由第一个空格\s分隔的两个部分,用-连接部分并将结果传递回重写引擎,其中第一个或第一个第二条规则将再次匹配。

请注意,此“代码”未经过全面测试,可能会遗漏一些罕见的情况和/或导致多次内部重写,但我认为它“运行良好”可以试一试。

答案 1 :(得分:0)

好吧......似乎这里的代码有效。 301 Redirect to replace all spaces to hyphens

RewriteCond %{THE_REQUEST} (\s|%20)
RewriteRule ^([^\s%20]+)(?:\s|%20)+([^\s%20]+)((?:\s|%20)+.*)$ $1-$2$3 [N,DPI]
RewriteRule ^([^\s%20]+)(?:\s|%20)+(.*)$ /$1-$2 [L,R=301,DPI]

我原来的规则之后就有了这个规则,它似乎工作得很好。希望这有助于任何人解决问题。 :)