0

Apache vhosts 構成を使用して、自分のサイトでリダイレクトを制御しようとしています。

以下の vhosts ファイルからわかるように/fr/de、、 などの 2 文字のリージョンを設定していますが、現在は無視しています。ただし、/es/cm (および など) を別のページにリダイレクトするための 301 パーマネント リダイレクト セットアップもあります。これはバックエンド システムで制御されます。/fr/cm/es/cm

複雑なのは、これが RewriteCond によってキャッチされる行を追加するときですが、ループに陥って移動するように見えるため、、などにまったくRewriteCond %{REQUEST_URI} !^/cmアクセスできず、 HTTP 500 内部サーバー エラーになります。/fr/de/eswww.ayrshireminis.com/fr/fr/fr/fr/fr/fr/fr/fr

RewriteCond を変更して、次のことを許可するにはどうすればよいですか。

  • /pa (これは /minis にリダイレクトされますが、データベースで制御され、有効な URL のままである必要があります)
  • /fr (地域)
  • /fr/pa
  • /es/pa

    # ----------------------------------------------------------------------
    # REGION SPECIFIC REDIRECTIONS
    # Below will remove region specific part of URL and load content from main UK site
    # ----------------------------------------------------------------------
    RewriteCond             %{REQUEST_URI}                  ^/([a-z]{2})$                   [OR]
    RewriteCond             %{REQUEST_URI}                  ^/([a-z]{2}/)(.*)$
    RewriteCond             %{REQUEST_URI}                  !^/cm
    RewriteRule             ^([a-z]{2}/|[a-z]{2})(.*)$      /$2                                             [L,QSA]

    # For VirtualDocumentRoot development instance configurations
    RewriteRule ^([^.]+)$ /index.php?url=$1 [L,QSA]
4

1 に答える 1

0

ここにあなたの問題があると思います。あなたの質問のフォーマットは[OR] 、最初のRewriteCond行の最後と[L,QSA]RewriteRule 自体を覆い隠しているようです。

代わりに試してみることをお勧めします:

RewriteCond %{REQUEST_URI} !^/cm
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/?(.*)$
RewriteRule .*   $2 [L,QSA]

私は「ガーディアン」パターンを使用して、最初から手付かずのものを捨てることを好みます。リストしたディレクティブのロジックにエラーがあるようです。最初の 2 つのディレクティブは、「REQUEST_URI が 2 文字のみで始まる場合、または 2 文字のみ始まる場合、「/」があり、最後まで何でも処理続行する」と言っているようです。

REQUEST_URI が「/fr」の場合、RewriteCond質問に含めた最初のディレクティブと一致します。しかし、それがこれと一致した場合、それはどうなるでしょうか? 2 番目の括弧で囲まれたグループに書き換えようとしていて、パターンによって 2 番目の括弧で囲まれたグループが検出されない場合、リダイレクト先が何もない場合、どのようにリダイレクトを行うことができますか? リクエストは、構成内の後続の Rewrite ルールに渡されます。

私もRewriteRule悪いかもしれないと思います。現在のディレクティブでは、次のようにする必要があります。

RewriteRule ^/([a-z]{2}/|[a-z]{2})(.*)$ /$2 [L,QSA]

おそらく先頭に「/」文字を追加する必要があります。そうしないと、「$2」が REQUEST_URI 全体に一致する可能性があります。REQUEST_URI は常に「/」で開始する必要があります。

おそらくすでにこれを試したことがあるでしょうが、より詳細なロギングを有効にすることをお勧めしますtail。ログ ファイルは、ブラウザにパターンを入力してサイトにアクセスする際に、パターンが一致するかどうかを確認します。私は現在これを使用しています:

RewriteEngine On
RewriteLog /usr/local/apache2/logs/rewrite.log
RewriteLogLevel 3

[L]これを防ぐ必要があるため、リダイレクトループに陥る理由を説明できません。私が考えることができる唯一のことは、これらのディレクティブ以外のアプリケーションの他の側面がリダイレクトに関与している場合、何らかの形でこの動作を引き起こし、リクエストを Apache にフィードバックしている可能性があるということです。より詳細なロギングは、access_log と組み合わせて、それを分離するのに役立つ場合があります。

于 2012-09-25T01:31:06.660 に答える