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

Htaccess recursively replace underscores with hyphens

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

我已经在网上尝试了很多示例,但这些示例要么提供了服务器错误,要么似乎导致了使我的服务器崩溃的循环。

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

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

RewriteRule ^(.*)_(.*)$ - [N,E=redirect:true]
RewriteCond %{ENV:redirect} ^true$
RewriteRule (.*)  [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

如何以尽可能少的规则将上面的下划线替换为连字符?

你可以使用它:

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

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

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

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

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

RewriteEngine On

# when there are more than one _ then "recursively" replace it by -
RewriteRule ^([^_]*)_+([^_]*_.+)$ - [N,DPI]

# when there is only one / then replace it by _ and redirect
RewriteRule ^([^_]*)_([^_]*)$ /- [NE,L,R=301]

之所以它适用于超过 10 个替换,是因为我们在第一条规则中使用 N 而不是 L 标志,从而提高了整体性能。