我试图将所有带下划线的URL重定向到同一个URL,但下划线要用连字符代替。
我在网上试过很多例子,但这些例子要么提供服务器错误,要么似乎导致循环,使我的服务器崩溃。
根据我所读到的,以下的方法应该可以。
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。
我需要重定向的一些URL例子如下。
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
我如何在尽可能少的规则中把上面的下划线替换成连字符?
其中一个实现会导致500的内部错误,如果有超过10个下划线被连字符取代,因为默认值是------。LimitInternalRecursion
变量为10。
这里有一种方法可以让这些替换对20个下划线有效。
RewriteEngine On
# when there are more than one _ then "recursively" replace it by -
RewriteRule ^([^_]*)_+([^_]*_.+)$ $1-$2 [N,DPI]
# when there is only one / then replace it by _ and redirect
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [NE,L,R=301]
为什么它可以替换10个以上的下划线 因为我们使用的是... N
而不是 L
在第一条规则中的标志,导致提高整体性能。
你可以用这个。
RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [L,NE]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,NE,R=301]
在@anubhava 的解释之后 如果大量的下划线可能是个问题,你可以使用这个方法(不含变量):在@anubhava解释之后。你可以使用这个(不含变量)。
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*_.*)$ $1-$2-$3-$4 [L,NE]
RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [L,NE]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,NE,R=301]