将下划线替换为.htaccess连字符的问题

将下划线替换为.htaccess连字符的问题,.htaccess,url-rewriting,.htaccess,Url Rewriting,虽然我已经看到了一些关于这个主题的帖子,但我仍然有一些问题要实现我想要的。 我的旧URL如下所示: http://myhostname.com/offer/1234_Nice_Offer_Cool_Whatever_HEllyeah.htm 显然我想把它们改写成: http://myhostname.com/offer/1234-nice-offer-cool-whatever-hellyeah.htm 这是我在.htaccess中尝试的代码。这可以很好地替换URL中没有任何目录的下划线:

虽然我已经看到了一些关于这个主题的帖子,但我仍然有一些问题要实现我想要的。 我的旧URL如下所示:

http://myhostname.com/offer/1234_Nice_Offer_Cool_Whatever_HEllyeah.htm
显然我想把它们改写成:

http://myhostname.com/offer/1234-nice-offer-cool-whatever-hellyeah.htm
这是我在.htaccess中尝试的代码。这可以很好地替换URL中没有任何目录的下划线:

RewriteCond %{REQUEST_URI} \.htm$ [NC]    
RewriteRule ^([^_]*)_+(.*)$ $1-$2 [E=underscores:Yes,N] 
RewriteCond %{ENV:underscores} ^Yes$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
因此,这对规则可以很好地处理URL,如:

http://myhostname.com/1234_Some_Section_hellyeah.htm
http://myhostname.com/dir1/dir2/dir3/1234_Some_Offer_Or_Section.htm
但当我为URL尝试相同的代码时,如下所示:

http://myhostname.com/1234_Some_Section_hellyeah.htm
http://myhostname.com/dir1/dir2/dir3/1234_Some_Offer_Or_Section.htm
然后,服务器进行一个无限循环(I图[N]标志…)
基本上,我想知道以何种方式影响这些规则的每个目录URL,以及为什么我会得到这个无限循环。谢谢

您不需要N标志。要递归地用连字符替换下划线,请使用以下代码:

RewriteRule ^([^_]+)_(.+?\.htm)$ $1-$2 [L,NC,E=underscores:Yes]

RewriteCond %{ENV:REDIRECT_underscores} ^Yes$
RewriteRule ^([^_]+)$ /$1 [R=301,L]

嗯,经过广泛的测试,我已经发布了。您的Apache版本支持env变量吗?我想是的,因为使用其他规则进行测试是有效的。我的版本是Apache/2.2.16。我想我们不需要第一行的[L]标志。我也用这个模拟器尝试了你们的规则,这个模拟器只用于非常基本的测试。您是否在浏览器中遇到404或其他错误?这些规则进行递归重定向,直到整个URL被替换。这意味着,对于长度超过10个单词的字符串,apache会显示500个错误。这可以通过“LimitInternalRecursion”参数轻松配置。我不明白为什么第二条规则永远不会执行。这是我的$服务器变量:
[REDIRECT\u REDIRECT\u REDIRECT\u下划线]=>Yes[REDIRECT\u REDIRECT\u STATUS]=>200[REDIRECT\u REDIRECT\u下划线]=>Yes[REDIRECT\u REDIRECT\u STATUS]=>200
,与上一次迭代类似,变量下划线丢失。如果URL中的下划线超过10个,则将达到重定向限制(可能性很小)。我花了大量时间来寻找解决方案,而原始的
N
标志甚至导致我的Apache占用了所有CPU,然后我不得不硬启动我的MacBook。不确定为什么env变量不适合您。尝试在第一条规则中添加
R
标志,看看您得到了什么。