Htaccess 递归地将下划线替换为连字符。

问题描述 投票:2回答:2

我试图将所有带下划线的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

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

.htaccess redirect rewrite
2个回答
3
投票

其中一个实现会导致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 在第一条规则中的标志,导致提高整体性能。


1
投票

你可以用这个。

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]
© www.soinside.com 2019 - 2024. All rights reserved.