2

htdocs/MVC/ フォルダーに .htaccess ファイルがあり、次のようになります

RewriteEngine On

# if its already been rewritten to the specific folder
RewriteCond %{REQUEST_URI} ^/MVC/public/img/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/MVC/public/index.php$
# skip next two rules
RewriteRule .? - [S=2]

# rewrite image requests
RewriteRule (.*\.(jpg|png|gif))$ public/img/$1 [L]
# rewrite all other requests to the front controller index.php
RewriteRule (.*) public/index.php?url=$1 [QSA,L]

私が達成したいのは、フォルダー MVC/public/img に送信されるすべての画像要求と、フォルダー MVC/public 内のフロント コントローラー index.php に送信される他のすべての要求です。これらのルールを設定し、mod_rewrite がループするのを防ぐには、これが最善の方法ですか?

4

1 に答える 1

5

フラグを使用しSてスキップすることは問題ありませんが、欠点は次のとおりです。

  1. 少し読みにくい(他の人が見ている場合)
  2. 新しいルールを追加する必要がある場合は、スキップする方法を確認する必要があります
  3. ルールがますます複雑になると、正しいスキップを維持することがますます難しくなります

ループを防止するその他の可能な方法:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

これをルールの一番上に置くと、前のループでルールが適用された (または mod_alias リダイレクトが適用された) 場合、書き換えが完全に停止します。

したがって、次のようになります。

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

# rewrite image requests
RewriteRule (.*\.(jpg|png|gif))$ public/img/$1 [L]
# rewrite all other requests to the front controller index.php
RewriteRule (.*) public/index.php?url=$1 [QSA,L]

長所: 2 回目は ENV チェックで即座に終了するため、ループについて心配する必要はありません。 短所: ループするルールを作成する必要が生じた場合、この方法では機能しなくなります。

于 2012-10-22T10:45:00.267 に答える