2017-08-13 9 views
1

は私がブラウザに通知したい2つのリライトルールがあると言う。複数のR = 301のリダイレクトルール、単一リダイレクト

  • 索引を除去WWWプレフィックス(http://example.orgからhttp://www.example.org
  • を除去.PHP(http://example.orgからhttp://example.org/index.php

Iは、両方のルールを適用したいのですが、私は301リダイレクトをもたらすためのいずれかのルールが欲しいです。両方のルールが一致する場合は、301のリダイレクトが1つしかないようにしたいと思います。

問題は、規則に[R]フラグがある場合、に従ってそれに付随する[L](最終)フラグも指定する必要があります。 URIへ

あなたは、ほとんどの場合、[L]と連動して、[R]を使用したいと思うでしょう(つまり、[R、L]を使用している)ので、自分自身で、[R]フラグ前に付加http://thishost[:thisport]が、これをルールセット内の次のルールに渡します。これにより、「無効なURIがリクエストされました」という警告が出ることがよくあります。

いずれの回避策もありますが、両方のルールで2回のリダイレクトが発生することはありませんか?

RewriteEngine On 

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

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

答えて

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> 
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] 
関連する問題