154

シンプルな PHP ベースの MVC っぽいフレームワークを作成しています。このフレームワークを任意のディレクトリにインストールできるようにしたい。

私の PHP スクリプトはリクエストの uri を取得し、セグメントに分割します。これにより、セグメント 1 がコントローラーになり、セグメント 2 がアクションになります。これを行うと、これはすべてうまくいきます:

http://www.example.com/mvc/module/test/

特定のモジュールコントローラーとメソッドに移動します。これで、home フォルダーにある既定のコントローラーである home コントローラーができました。

このフォルダーに直接アクセスする と、このフォルダーが存在するため、http://www.example.com/mvc/home/ が表示され403 forbiddenますが、代わりにに戻る必要があります http://www.example.com/mvc/index.php

フレームワークを別のフォルダーにインストールした場合、リダイレクトする必要があるフォルダーフレームワークとしましょうhttp://www.example.com/framework/index.php

すべてのフォルダーと php ファイルを index.php にリダイレクトして、他のすべてをそのままにしたいと思います。

私が最初に遭遇した問題は、正しいフォルダーにリダイレクトされず、常にドメイン ルート フォルダーにリダイレクトされないことでした。

これは私が試したものです:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
4

8 に答える 8

309

書き換えルールはほとんど問題ないようです。

最初に、.htaccessファイルがドキュメントルート (と同じ場所index.php) にあることを確認してください。そうしないと、ファイルが含まれるサブフォルダー (およびその中のすべてのサブフォルダー - 再帰的に) にのみ影響します。

次に、ルールを少し変更して、次のようにします。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

現時点では、どれが任意の文字の1 つ.のインスタンスであるかを照合しているだけですが、少なくとも任意の文字の任意の数のインスタンスと一致する必要があります。.*

$_GET['path']変数には偽のディレクトリ構造が含まれます。/mvc/module/testたとえば、これを index.php で使用して、実行するコントローラーとアクションを決定できます。


シバン全体をサブディレクトリにインストールする場合、/mvc/または/framework/それを行うための最も簡単な方法は、それを考慮して書き換えルールをわずかに変更することです。

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

ファイルがドキュメントルートにある間、あなたindex.phpがそのフォルダーにあることを確認してください。.htaccess


代替$_GET['path'](2018 年 2 月および 19 年 1 月に更新)

パスを変数として設定することは実際には必要ではありません (現在でも一般的です) $_GET。多くのフレームワークは、同じ情報を取得するために依存し$_SERVER['REQUEST_URI']ます (通常、使用するコントローラーを決定するために)。ただし、原則はまったく同じです。

パスRewriteRuleパラメーターを作成する必要がないため、これは少し単純化されます (つまり、OP のオリジナル機能するようになります)。RewriteRule

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

ただし、サブディレクトリへのインストールに関する規則は引き続き適用されます。

RewriteRule ^.*$ /mvc/index.php [L,QSA]



フラグ:

NC= No Case (大文字と小文字を区別しません。パターンに文字がないため、実際には必要ありません)

L= Last (この Rewrite の後に書き換えを停止するため、書き換えリストの最後にあることを確認してください)

QSA= Query String Append のよう?like=penguinsに、最後に保持して index.php に渡したいものがある場合に備えて追加します。

于 2013-08-23T15:35:05.613 に答える
18

次のようなものを使用できます。

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

これにより、すべてのクエリがルート ディレクトリの index.php にリダイレクトされます。画像、JavaScript ファイル、スタイル シートなど、存在するファイルのクエリもリダイレクトされることに注意してください。

于 2013-08-23T15:24:14.180 に答える