【问题标题】:Issues Replacing underscores to hyphens with .htaccess使用 .htaccess 将下划线替换为连字符的问题
【发布时间】:2013-07-19 08:44:28
【问题描述】:

虽然我已经看过一些关于这个主题的帖子,但我仍然遇到一些问题来实现我想要的。 我的旧网址是这样的:

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

但是当我为 URL 尝试相同的代码时:

http://myhostname.com/dir1/dir2/dir3/1234_Some_Offer_Or_Section.htm

然后,服务器进行一个无限循环(我图 [N] 标志...) 基本上,我想知道以何种方式影响这些规则的每个目录 URL,以及为什么我会得到这个无限循环。谢谢!

【问题讨论】:

    标签: .htaccess url-rewriting


    【解决方案1】:

    你不需要 N 标志。用连字符递归替换下划线以下代码将起作用:

    RewriteRule ^([^_]+)_(.+?\.htm)$ $1-$2 [L,NC,E=underscores:Yes]
    
    RewriteCond %{ENV:REDIRECT_underscores} ^Yes$
    RewriteRule ^([^_]+)$ /$1 [R=301,L]
    

    【讨论】:

    • 嗯,经过大量测试,我已经发布了它。您的 Apache 版本是否支持环境变量?
    • 我认为是这样,因为使用其他规则进行测试是有效的。我的版本是 Apache/2.2.16。我认为我们不需要第一行的 [L] 标志。我也用这个模拟器尝试了你的规则htaccess.madewithlove.be
    • 该模拟器仅用于非常基本的测试。您是否在浏览器中收到 404 或其他错误?
    • 规则进行递归重定向,直到整个 URL 被替换。这意味着对于长度超过 10 个字的字符串,apache 会显示 500 错误。这可以通过“LimitInternalRecursion”参数轻松配置。我不明白为什么第二条规则永远不会执行。这是我的 $_SERVER 变量:[REDIRECT_REDIRECT_REDIRECT_underscores] => Yes [REDIRECT_REDIRECT_REDIRECT_STATUS] => 200 [REDIRECT_REDIRECT_underscores] => Yes [REDIRECT_REDIRECT_STATUS] => 200 [REDIRECT_STATUS] => 200 在最后一次迭代中,变量下划线丢失了。
    • 如果 URL 中的下划线超过 10 个,将达到重定向限制(极不可能)。我花了很多时间为这个和原始的N 标志寻找解决方案,甚至导致我的 Apache 占用所有 CPU 并导致然后我不得不硬启动我的 MacBook。不知道为什么 env 变量不适合你。尝试在第一条规则中添加R 标志,看看你会得到什么。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2015-04-20
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多