【问题标题】:Replace underscores to hyphens before triggering 301在触发 301 之前将下划线替换为连字符
【发布时间】:2015-04-20 06:56:03
【问题描述】:

我想在永久 301 重定向之前替换 URL 中的所有连字符。例如:http://www.example.com/article_category/article_name 对此:http://www.example.com/article-category/article-name

我的 .htaccess 文件如下所示:

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_URI} ![_]
RewriteRule .? - [S=2]
RewriteRule ^/?([^_]+)_(.*)$ $1-$2 [N,L]
RewriteRule ^(.*)$ /$1 [R=301,L]

[S] 标志用于防止每次重定向发生时重复最后一条规则,从而导致循环。但似乎最后一条规则没有触发,因为请求的 URL 保持不变,而我从想要的页面获取内容。我尝试从第三行删除 L 标志,但它会导致循环:(

【问题讨论】:

    标签: .htaccess mod-rewrite http-status-code-301


    【解决方案1】:

    只使用环境变量可能更容易。您可以使用E rewrite 标志设置它们。然后您可以在重写条件中检查 env 变量:

    Options +FollowSymlinks
    RewriteEngine On
    
    RewriteRule ^(.*)_(.*)$ /$1-$2 [E=DASH:Y,DPI]
    RewriteCond %{ENV:DASH} Y
    RewriteRule ^([^_]+)$ /$1 [L,R=301]
    

    因此,第一个规则检查 URI 中是否有 _,然后将其重写为 -。因为发生了这种重写,所以我们设置了DASH 环境变量。

    除非设置了环境变量DASH,否则第二条规则不会执行任何操作,这意味着至少有1 个_ 被重写为-,并且正则表达式确保没有更多@ 987654330@ 在重定向到浏览器之前留在 URI 中

    【讨论】:

    • 感谢您的回答。使用 env var 的方法很有趣,但它仍然不会重定向。
    • @geter712 很奇怪,我可以发誓它对我有用。所以这里有两件事,L 标志缺少 ENV,所以我删除了它,还有一个 strange bug with apache 可能会或可能不会发生,这就是为什么我添加了一个 DPI 标志来删除 PATH_INFO。查看上面的修改
    • 奇怪的错误与否,它让我紧张了三天,所以我决定调用外部 php 脚本来整理 url 并执行 301。mod_rewrite 非常强大但也非常不必要的复杂和错误...
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2014-11-26
    • 2019-02-08
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多