我正在尝试将所有带下划线的网址重定向到相同的网址,但下划线用连字符替换。
我在网上尝试了很多例子,但是这些例子提供了服务器错误,或者似乎导致了一个导致我的服务器崩溃的循环。
根据我的阅读,以下内容应该有效:
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
如何在尽可能少的规则中用上面的连字符替换下划线?
答案 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]