.htaccess ディレクティブは、特定の URL をリダイレクトしません*
-
08-06-2019 - |
質問
に大きく依存するアプリケーションでは、 .htaccess
PrettyURL (私の場合は CakePHP) の RewriteRules ですが、この書き換えから特定のディレクトリを除外するディレクティブを正しく設定するにはどうすればよいですか?あれは:
/appRoot/.htaccess
app/
static/
デフォルトでは、すべてのリクエストは /appRoot/*
によって取得されるように書き換えられています app/webroot/index.php
, 、そこで分析され、対応するコントローラーアクションが呼び出されます。これは、次のディレクティブによって行われます。 .htaccess
:
RewriteBase /appRoot
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
ここで、static/ などのいくつかのディレクトリをこの書き換えから除外したいと思います。これで試してみました 前に Cake RewriteRules:
RewriteCond $1 ^(static|otherDir).*$ [NC]
RewriteRule (.*) - [L]
これまでのところ、リクエストが書き換えられることはなくなりましたが、現在は機能しています。 全て リクエストは、一致しないはずの正当な Cake リクエストであってもスキップされます。 ^(static|otherDir).*$
.
これらのルールのいくつかのバリエーションを試してみましたが、希望どおりに動作させることができません。
解決
そして正解はiiiiis...
RewriteRule ^(a|bunch|of|old|directories).* - [NC,L]
# all other requests will be forwarded to Cake
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
これらのディレクティブが設定されているにもかかわらず、ルートディレクトリにあるindex.phpファイルが最初に呼び出された理由はまだわかりません。現在は次の場所にあります
/appRoot/app/views/pages/home.ctp
Cakeを通じても処理されます。これを導入すれば、これも同様に機能したと思います (Mike の提案を少し変更したバージョン、未テスト):
RewriteCond $1 !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$ app/webroot/$1 [L]
他のヒント
次のルールに条件を適用するのではなく、次のように否定を適用することはできませんか (いくつかのバリエーションはありますが、私は .htaccess ルールを覚えるのがあまり得意ではないので、フラグが間違っている可能性があります)。
RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/ [L]
RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]
前のルールから [L] を削除します。
RewriteBase /appRoot
RewriteRule ^$ app/webroot/
RewriteRule (.*) app/webroot/$1
[L] は、「書き換えプロセスをここで停止し、これ以上書き換えルールを適用しない」ことを意味します。