在htaccess中,我想用连字符替换下划线,然后将用户重定向到新的url


In htaccess, I'd like to replace underscores with hyphens and then redirect the user the new url

我想将任何包含下划线的请求重定向到相同的url,但用连字符替换url。我看到很多论坛建议我这样做:

(重复这个rewriterrule的增量版本,直到无数次)

rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L]
rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L]
rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L]

我目前在php的解决方案是(这工作得很好):

if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){
    $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']);
    header('Location: '. $redirectUrl , TRUE, 301);
    return;
}

但是,我宁愿不使用php &而是把它保存在我的htaccess文件中,而不必一遍又一遍地重复第一个rewriteRule,以预测每个url可能有多少下划线。想法吗?是否有这样一种方法来做到这一点,而不重复增量rewriterrule ?

----- edit -----

我当前的htaccess文件只是标准的WordPress文件,它在下面:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index'.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

参见"Next"指令/重写标志,这会导致从第一条规则开始重新评估规则集:http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

像这样可以工作:

RewriteRule (.*)_(.*) $1-$2 [N] 

把两者结合起来怎么样?有一个重写规则,重写为执行替换和重定向的PHP脚本。这样可以避免多个重写规则,可以处理任意数量的下划线,并且只在需要时调用PHP重定向。