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-funny301

简要说明:如果 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重定向以将所有空格替换为连字符的主要内容,如果未能解决你的问题,请参考以下文章

Htaccess - 将下划线结合到连字符和大写到小写 301 重定向

将301从下划线重定向到连字符

IIS 7.5 的 301 重定向以仅替换域并维护页面结构

htaccess 301 重定向某些 URL 模式

301 重定向没有子目录/查询字符串

301 重定向 - 替换 URL 的一部分