301重定向以将所有空格替换为连字符
Posted
技术标签:
【中文标题】301重定向以将所有空格替换为连字符【英文标题】:301 Redirect to replace all spaces to hyphens 【发布时间】:2011-08-14 20:02:00 【问题描述】:所以这是我的问题。我接管了一个网站,该网站有一堆被索引的页面,其中 %20 在谷歌中被索引。这仅仅是因为该人决定仅使用标签名称作为标题和 url slug。所以,网址是这样的:
http://www.test.com/tag/bob%20hope
http://www.test.com/tag/bob%20hope%20is%20funny
我为 url slug 添加了一个新字段,字符串用破折号替换了所有空格。虽然链接到这些新页面并获取数据没有问题,但我需要将旧 URL 301 重定向到新 URL,这将类似于:
http://www.test.com/tag/bob-hope
http://www.test.com/tag/bob-hope-is-funny
因此,它需要能够考虑多个空格。任何问题? :)
【问题讨论】:
【参考方案1】:在您的 .htaccess 文件中使用这些规则:
Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /
# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)[\s%20]+(.*)$ $1-$2 [E=NOSPACE:1]
# when there is no space make an external redirection
RewriteCond %ENV:NOSPACE =1
RewriteRule ^([^\s%20]+)$ $1 [R=301,L]
这会将所有空格字符(\s
或 %20
)替换为连字符 -
所以/tag/bob%20hope%20is%20funny
的URI 将变为/tag/bob-hope-is-funny
和301
简要说明:如果 URI 中有超过 1 个空格,则第一个 RewriteRule 会递归触发,用连字符 -
替换每个空格字符,直到没有空格为止。此规则只会在内部重写。
一旦没有剩余空间,就会触发第二个 RewriteRule,它只对转换后的 URI 使用 301 redirect
。
【讨论】:
DPI 标志对我来说是新的,所以也许我只是不知道它是如何工作的,但这不是一直重写,一次删除一个空格,直到所有空格都被删除更换?我认为这可行,但它似乎有点复杂。他还需要它来实际执行 301 重定向,而且看起来这不会那样做。如果我弄错了,请纠正我。 感谢您添加解释!我每天都在 Stack Overflow 上学到新东西。 :) 以空格开头的网址呢?比如 domain.com/ test test test /test @PanagiotisGeorgeRaditsas:我相信它应该有效。如果没有,请随时发布一个带有此链接的新问题,并在此处发表评论。我一定会努力解决这个问题。 @anubhava 你好,伙计,请看这篇文章,它描述了我上面所说的问题,谢谢。 ***.com/questions/18935257/…【参考方案2】:以@anhubhava 的回答为基础,它很接近,但它也会匹配 URL 中的 %,2 或 0,如果您不使用 DPI 参数,它可能会导致 apache 2.2 出现循环。完整的脚本应该如下所示:
Options FollowSymlinks MultiViews
RewriteEngine on
RewriteBase /
# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1-$2 [N,E=NOSPACE:1,DPI]
# when there is no space make an external redirection
RewriteCond %ENV:NOSPACE =1
RewriteRule ^([^\s%20]+)$ $1 [R=301,L]
我还添加了 N(下一个)参数,因为如果匹配,则强制在此规则之后直接从头开始重新评估规则。如果这不存在,如果您使用 apache 作为反向代理,您可能会遇到问题,因为它不太可能在其他事情发生之前完成重写。
【讨论】:
它似乎不适用于包含数字的网址。以上是关于301重定向以将所有空格替换为连字符的主要内容,如果未能解决你的问题,请参考以下文章