Htaccess用连字符递归替换下划线

时间:2015-01-25 02:53:28

标签: .htaccess redirect rewrite

我正在尝试将所有带下划线的网址重定向到相同的网址,但下划线用连字符替换。

我在网上尝试了很多例子,但是这些例子提供了服务器错误,或者似乎导致了一个导致我的服务器崩溃的循环。

根据我的阅读,以下内容应该有效:

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

RewriteRule ^(.*)_(.*)$ $1-$2 [N,E=redirect:true]
RewriteCond %{ENV:redirect} ^true$
RewriteRule (.*) $1 [R=301]

但是这些没有,相反它们似乎会导致页面加载一段时间然后超时/ 404。

我需要重定向的一些示例网址如下:

https://domain.com/blog/this_is_a_post_5
https://domain.com/blog/i_am_a_post_12
https://domain.com/forum/i_am_a_forum_post_15

如何在尽可能少的规则中用上面的连字符替换下划线?

2 个答案:

答案 0 :(得分:3)

如果有超过10个下划线要用连字符替换,则其中一个实现将导致500个内部错误,因为LimitInternalRecursion变量的默认值为10。

以下是一种可以使这些替换适用于20个下划线的方法:

RewriteEngine On

# if there is only one underscore then repalce it by - and redirect
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=302]

# if there are more than one underscores then "repeatedly" repalce it by - 
# and set env var USCORE
RewriteRule ^([^_]*)_([^_]*)_(.*) $1-$2-$3 [E=USCORE:1]

# if USCORE env var is set then redirect
RewriteCond %{ENV:REDIRECT_USCORE} =1
RewriteRule ^([^_]+)$ /$1 [L,R=302]

为什么它适用于最多20个替换,因为我们正在替换每个规则中的2个下划线(参见上面的第2条规则),因此将替换减少一半并提高整体性能。

答案 1 :(得分:1)

您可以使用:

RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [L,NE]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,NE,R=301]

在@anubhava解释之后。如果大量下划线可能是个问题。你可以使用它(没有变量):

RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*_.*)$ $1-$2-$3-$4 [L,NE]
RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [L,NE]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,NE,R=301]