1

htaccessとmod_rewriteが私の最良の領域ではないという事実でこれを前置きします。個人使用のphpMVCフレームワークを作成しました。ドキュメントのルートには、css、js、画像などの「public」というフォルダーがあります。すべてのHTTPリクエストは、「public」のファイルと照合され、存在するかどうかが確認されます。 、そのファイルを送信します。それ以外の場合は、フレームワークのindex.phpにリダイレクトされます。

ルールは機能しますが、「public」で一致が行われた場合でも、index.phpにルーティングされます。index.phpにリダイレクトする最後の行をコメントアウトすると、cssとjsが正しく読み込まれます。「公開」マッチが行われた後、処理を停止させることができません。

前もって感謝します

Options +FollowSymLinks
RewriteEngine On

#If file exists as public resource
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/public/$1 [NC,L]


#Redirect everything else to index.php
RewriteRule ^(.*) index.php [NC,L]
4

2 に答える 2

2

リクエストがすでにパブリックディレクトリをポイントしているかどうかを確認するためのテストを追加し、ポイントされていない場合にのみRewriteRuleをトリガーする必要があります。

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^.*$ index.php

[L](「最後の」)フラグは誤解されることが多いことに注意してください。現在のパスでリクエストがさらにテストおよび変更されるのを停止しますが、Apacheがルールセット全体で新しく変更されたリクエストを最初から実行するのを停止することはできません(これは、.htaccessルールが上からすべての新しいものに適用されるために発生します)または変更されたリクエスト)。したがって、RewriteCondディレクティブを追加して、ルールセットの前のパスでパブリックフォルダーをポイントした要求を処理していないことを確認する必要があります。

詳細については、「最後の」フラグについてApache2.4のドキュメントを参照してください。[Apache 2.4は、[END]リクエストが別のリライト処理を通過するのを停止するフラグを提供しますが、この新しいフラグはApache2.2以前では使用できないことに注意してください。]

于 2012-09-08T19:29:58.067 に答える
1

不必要なチェックを行っているように見えます。また、書き換えを実行するたびにルールの新しいパスをトリガーするという事実に見舞われています。

多分このようなことを試してみませんか?

RewriteEngine On

# pass through anything in the domain.com/public directory
RewriteRule ^/public/(.*)$ - [NC,L]

# route everything else to index
RewriteRule ^(.*)$ index.php [NC,L]

これは、最初のパスでパブリックディレクトリ内のすべてを通過する必要があります。それ以外の場合は、2番目のルールであるAFAIKを確定するために2パスかかります。主なトリックは、リライトをトリガーしないルートを提供することだと思います。そのため、2番目のパスをトリガーしません。

括弧の内容を$1、$ 2、...として書き換える場合を除いて、括弧は実際には必要ないことにも注意してください。

于 2012-09-08T20:04:42.367 に答える