【问题标题】:Apache rewrite underscores to hyphens except when preceded by forward slashApache 将下划线重写为连字符,除非前面有正斜杠
【发布时间】:2013-11-14 16:49:42
【问题描述】:

我正在尝试使用正确的 RewriteRule 或 RewriteCond 将下划线更改为连字符,除非下划线前面带有正斜杠。我制定了以下规则,这些规则将所有下划线更改为连字符,无论它前面是什么:

RewriteRule ^([^_]*)_+(.*)$ $1-$2 [E=underscores:Yes,N]

RewriteCond %{ENV:underscores} ^Yes$
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

我需要修改什么以防止'/_'被更改为'/-'?

例子:

http://host/_test_location/_test_page 更改为 http://host/_test-location/_test-page不是 http://host/-test-location/-test-page

感谢您的帮助!

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite rewrite


    【解决方案1】:

    试试这个稍加修改的规则:

    RewriteRule ^(.*?[^/])_+(.*)$ $1-$2 [E=underscores:Yes,N]
    
    RewriteCond %{ENV:underscores} ^Yes$
    RewriteRule ^(.+)$ /$1 [R=302,L]
    

    【讨论】:

    • 我一定是完全错过了这条船。我在 Apache 中有 anubhava 的代码,现在它没有用连字符替换任何下划线
    • 在发帖之前我已经测试过了。试试RewriteRule ^(.*?[^/])_+(.*)$ $1-$2 [E=underscores:Yes,N]
    • 做到了。谢谢!
    【解决方案2】:

    尝试在您的第一个正则表达式中将* 更改为+

    RewriteCond %{REQUEST_URI} ^(.*)/([^/_]+)_+(.*)$
    RewriteRule ^ %1/%2-%3 [E=underscores:Yes,N]
    

    + 表示它必须至少匹配一个。所以_test 的刺痛在_ 之前没有任何非“_”字符,因此不会匹配。

    【讨论】:

    • 刚刚尝试了您的建议,不幸的是它仍然将 /_test 更改为 /-test
    • @BradRodgers 你确定吗?我在 vanilla apache 安装和空白 htaccess 文件中对其进行了测试,它可以工作。您是否清除了浏览器的缓存?
    • @BradRodgers 实际上,第二个 _ 仍然被转换,尝试在前面添加 /? 并删除 ^
    • 您能否发布一个包含您的建议的新代码块。我没有让它工作,也许我没有完全理解你的建议。谢谢!
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 2013-09-05
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多