【问题标题】:In htaccess, I'd like to replace underscores with hyphens and then redirect the user the new url在 htaccess 中,我想用连字符替换下划线,然后将用户重定向到新的 url
【发布时间】:2011-11-30 19:42:52
【问题描述】:

我想将包含下划线的任何请求重定向到相同的 url,但用连字符替换 url。我看到很多论坛建议我这样做:

(重复这个 rewriteRule 的一个递增版本,直到一个 gazillion)

rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L]
rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L]
rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L]

我目前在 php 中的解决方案是(效果很好):

if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){
    $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']);
    header('Location: '. $redirectUrl , TRUE, 301);
    return;
}

但是,我宁愿不使用 php,而是将其保存在我的 htaccess 文件中,而不必一遍又一遍地重复第一个 rewriteRule 以预测每个 url 可能有多少下划线。想法?有没有这样的方法可以在不重复递增的 rewriteRule 的情况下做到这一点?

----- 编辑 -----

我当前的 htaccess 文件只是标准的 WordPress 文件,如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【问题讨论】:

  • 这是我看到它工作的唯一方式,你没有在 mod rewrite 中替换,只有用匹配的模式重写规则。

标签: php .htaccess mod-rewrite redirect


【解决方案1】:

查看“Next”指令/重写标志,这会导致从第一条规则开始重新评估规则集:http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

这样的事情可能会奏效:

RewriteRule (.*)_(.*) $1-$2 [N] 

【讨论】:

  • @llmari Karonen - 我很好奇,你用什么 url 来测试这个?
  • 我最终将其用作规则 RewriteRule ^([^_]*)_(.*)$ /$1-$2 [R=301,L]
【解决方案2】:

如何结合 2. 有一个重写规则,重写为执行替换和重定向的 PHP 脚本。这样可以避免多个重写规则,可以处理任意数量的下划线,并且只在需要时调用 PHP 重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多