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
标志,从而提高了整体性能。
我正在尝试将所有带下划线的 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
标志,从而提高了整体性能。