.htaccess中的多个R = 301重定向规则,单个重定向

时间:2017-08-13 04:46:58

标签: apache .htaccess mod-rewrite

假设我有两条重写规则,我想通知浏览器:

  • 删除www前缀(http://www.example.orghttp://example.org
  • 删除index.php(http://example.org/index.phphttp://example.org

我想同时应用这两个规则,并且我希望这两个规则都能导致301重定向。如果两个规则都匹配,我希望只有一个301重定向。

问题是,当规则有[R]标志时,我还必须根据Apache documentation指定[L](最后)标志。

  

您几乎总是希望将[R]与[L]结合使用(即使用[R,L]),因为[R]标志本身会在http://thishost[:thisport]前面加上URI,但随后将其传递给规则集中的下一个规则,这通常会导致请求中的“无效URI”。警告。

是否有任何变通办法,以便我可以让两个规则都不会导致2次重定向?

RewriteEngine On

# Naked domains
RewriteRule ^/?(.*)$ http://example.org/$1 [R=301,L]

# Remove index.php
RewriteRule ^index.php/(.*)$ /$1 [R=301,L]

2 个答案:

答案 0 :(得分:0)

不,L标志是告诉重写过程停止处理可能遵循这些重写的新重写,但由于您正在进行外部重定向,我怀疑没有它会导致问题。不过,真正的问题是你为什么使用mod_rewrite(或.htaccess)就是这么简单(当没有更简单的选项时应该保留mod_rewrite)。

这是正确的方法(没有mod_rewrite)。

#NameVirtualhost *:80 <- add and uncomment this only if your version is 2.2

<Virtualhost *:80>
    ServerName example.org
    DocumentRoot /path/to/your/htdocs
    RedirectMatch 301 ^/index.php/(.*) /$1

    #other config
</Virtualhost>

<Virtualhost *:80>
    ServerName www.example.org
    Redirect 301 / http://example.org/
</Virtualhost>

答案 1 :(得分:0)

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.* - [E=A:http://%1]

RewriteCond %{REQUEST_URI} ^/index.php
RewriteRule ^index.php - [E=B:/]

RewriteCond %{ENV:A} .+
RewriteCond %{ENV:B} ^$
RewriteRule ^(.*) - [E=B:/$1]

RewriteCond %{ENV:A} .+ [OR]
RewriteCond %{ENV:B} .+
RewriteRule .* %{ENV:A}%{ENV:B} [R=301,L]