2016-05-31 4 views
0

私は次のシナリオを持っている:Webディレクトリ(ドキュメントルート)でmod_rewriteをオミットHTMLの拡張ループ

二frontcontrollers:

web/frontend.php # handles all *.html requests 
web/backend.php # direct calls only 

書き換えは、これまでに簡単です:

ので
RewriteCond %{REQUEST_URI} !^/backend.php 
RewriteRule (.+)\.html$ /frontend.php [L] 

今私がexample.org/backend.phpと呼んだとき、私はバックエンドにいますが、特別なことは起こりません。 example.org/example.org/team/john.htmlのようなものを呼び出すと、frontend.phpによって処理されます。

これまでのところ動作します!

example.org/team/johnが内部でexample.org/team/john.htmlとして処理されるように、* .html拡張子を省略することができます。少なくとも最後にではなく、

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_URI}.html [L] 

私は、重複したコンテンツを避けるためにjohnjohn.htmlに要求をリダイレクトします。

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI} ^(.+)\.html$ 
RewriteRule (.*)\.html$ /$1 [R=301,L] 

すべての部分は自分で動作しますが、一緒に組み立てるとループが発生しますが、私には驚きませんが、これを避ける方法はわかりません。私はドキュメントを検索し、いくつかのフラグと条件を試しましたが、私は完全に立ち往生しており、私は助けが必要です。すべてのヘルプは素晴らしいことだ

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/

    # extend html extension internally 
    RewriteCond %{REQUEST_FILENAME}.html -f 
    RewriteRule !.*\.html$ %{REQUEST_URI}.html [L] 

    # redirect example.html to example 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteCond %{REQUEST_URI} ^(.+)\.html$ 
    RewriteRule (.*)\.html$ /$1 [R=301,L] 

    # frontcontroller 
    RewriteCond %{REQUEST_URI} !^/backend.php 
    RewriteRule (.+)\.html$ /frontend.php [L] 
</IfModule> 

:ここ

は全体の.htaccessファイルです。

答えて

1

を防ぐために、ENDフラグを使用することができ、あなたはTHE_REQUEST

RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteCond %{THE_REQUEST} "\.html " 
    RewriteRule ^(.*)\.html$ /$1 [R,L] 

を使用することができます無関係ですが、ルールを単純化することができます。まず1

RewriteCond %{REQUEST_URI} !^/backend.php 
RewriteRule (.+)\.html$ /frontend.php [L] 

あなたは既に(.+)\.htmlをチェックし、あなたがRewriteCondを省略することができます。次に、キャプチャされた部分(.+)は使用しません。それが空でないことを確認するために.と交換してください。これは、あなたのサイトで*.html.htmlファイルを持っていない限り、あなたは!htmlをチェックする必要はありませんし、ちょうどRewriteRuleパターンを^を使用することができ、その後、

RewriteRule .\.html$ /frontend.php [L] 

2つ目を与え

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule^%{REQUEST_URI}.html [L] 
+0

驚くばかり!ありがとうございました! –

1

ループがあるため、複数の内部リダイレクトであり、あなたはループを回避するために書き換えループ

RewriteRule ^(.+)\.html$ /$1 [L,R=301] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_URI}.html [END] 
+0

、グッド迅速かつ役に立ったありがとうございました!しかし、私は余分な努力のためにオラフスの答えに印をつけました。 –

関連する問題