0

の問題mod_rewrite

Apache のmod_rewrite. この件についてはすでに 1 つの質問を投稿しており、それは明確になっていますが、構成に論理的な障害が見られないというエラーが引き続き発生します。どんな助けでも大歓迎です!

.htaccess私が使用しているのは次のとおりです。

# Begin Rewrite Module for http://*.example.com/
# ==============================================
<IfModule mod_rewrite.c>

    # Turn the rewrite engine on and set the base path.
    RewriteEngine On
    RewriteBase /

    # Map subdomains to their respective directories.
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
    RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]

</IfModule>

内部リダイレクトが多すぎるため、これは機能しません。結果として、500 Internal Server Error次のデバッグ ログが表示されます。

[Fri Feb 15 16:49:30.318509 2013] [core:error] [pid 2316:tid 1708] [client 127.0.0.1:9141] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3502): [client 127.0.0.1:9141] AH00121: r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /

[L]RewriteRuleのフラグのフラグを置き換えることで、一種の解決策を見つけました[END]。リクエストURIをサブドメインディレクトリ内の対応するファイルに正確にマッピングすることで完全に機能します。

残念ながら、それはあまりにも完璧に機能します。への呼び出しは、DirectoryIndexを考慮せずに内部的subdomain.example.com/folder/に書き換えます。example.com/public_subdomains/subdomain/folder/example.com/public_subdomains/subdomain/folder/index.phpindex.php

誰かが私にこれを明らかにするのを手伝ってくれるなら、私は永遠に感謝します!

4

1 に答える 1

4

さて、大丈夫論理エラーがあります。ドキュメントからの素晴らしい制御フロー図を参照させてください:

mod_rewriteの動作に関する制御フロー図

ご覧のとおり、内部リダイレクトもリクエストであるため、すべての書き換えルールによって再度処理されます。したがって、ユーザーがsomething.example.com/xを要求するとします。RewriteRulemacthes、RewriteCondが実行されるため、public_subdomains / something/xへの内部リダイレクトが行われます。新しいリクエストはsomething.example.com/public_subdomains/something/xへのリクエストです。RewriteRuleが一致し、RewriteCondが実行されます...そして、無限のループがあります。

[L]フラグは、現在のリクエストの処理のみを停止します。リクエストは、とにかく2番目のパスで処理されます。[END]フラグはループを停止しますが、副作用があることに気付いたように、ブルートフォース攻撃であるため、再帰を停止する条件を組み込むことをお勧めします。このようなもの:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/public_subdomains/%1
RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]

追加されたRewriteCondは、要求されたURIがすでに「public_subdomains/something」で始まっているかどうかを確認します。

テストされていないため、問題が発生する可能性がありますが、これが基本的な考え方です。

于 2013-02-15T17:50:52.710 に答える