2

次のような URL 構造を持つ新しい PHP サイトの MVC パターンを実装しています。

example.com/module/controller/action?params=...

ここに私の .htaccess ファイルがあります:

Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) portal.php?mvc=$1 [QSA,L]

ルールはほとんど正常に機能していますが、パブリック スペースにモジュールと同じ名前のディレクトリが?mvc=[directory name]あり、末尾にスラッシュがない場合は URL の末尾に追加されます。

例:
example.loc/indexに変わりますexample.loc/index/?mvc=index
example.loc/index/、同じままです。

ユーザーが入力した場合example.loc/index、末尾のスラッシュが含まれている場合と同じ動作をするようにするにはどうすればよいですか?

4

2 に答える 2

0

RewriteCond %{REQUEST_FILENAME} !-f ディレクティブが必要ですか? Apache は example.loc/index/ をファイルではなくファイル システム内のフォルダーとして扱うと思います。

于 2012-10-01T21:30:24.797 に答える
0

これは、mod_dir のDirectorySlashディレクティブが書き換えを妨げているためです。mod_dir と mod_rewrite はどちらも同じ URL ファイル マッピング パイプラインにあり、他のモジュールが何を行っていようと、どちらもそれぞれの目的を果たします。そのため、mod_dir が要求がディレクトリに対するものであると判断し、末尾のスラッシュが欠落している場合、リダイレクトする URL にフラグを立てますが、URL は mod_rewrite が URI に対して処理を行う処理パイプラインを下ります。行の最後で、両方のモジュールが URI を変更し、URI301 リダイレクトのフラグが立てられたので、ブラウザへの応答は新しい URI (マングルされたもの) にリダイレクトすることです。

解決策: mod_rewrite 内の末尾のスラッシュを処理するか、単純に無効にDirectorySlashする必要があります (ただし、情報漏えいのセキュリティ警告に注意する必要があります)。mod_rewrite の末尾のスラッシュは次のように処理できます。

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

その * を行のすぐ下に必ず追加してくださいRewriteEngine on。MVC ルーティングが発生する前に、これを適用する必要があります。

于 2012-10-01T21:26:29.060 に答える