1. ホーム
  2. php

[解決済み] htaccessでindex.phpにリダイレクトする。

2022-05-31 23:26:15

質問

私は、シンプルな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

もし、フレームワークを別のフォルダにインストールした場合、たとえば、frameworkフォルダにリダイレクトさせなければなりません。 http://www.example.com/framework/index.php

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

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

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

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

どのように解決するのですか?

あなたのリライトルールはほぼ大丈夫のように見えます。

まず、あなたの .htaccess ファイルがドキュメントルートにあることを確認します (これは index.php と同じ場所)でなければ、それがあるサブフォルダ(およびその中の任意のサブフォルダ - 再帰的に)にのみ影響します。

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

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

今のところ、あなたはただ . であり、これは 一つ のインスタンスである場合、少なくとも .* が必要です。

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



サブディレクトリに全体をインストールしたい場合、例えば /mvc/ または /framework/ を使用する場合、最も簡単な方法は、それを考慮に入れてリライトルールを少し変更することです。

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

そして、あなたの index.php がそのフォルダにあることを確認し、一方 .htaccess ファイルはドキュメントルートにあります。



に代わるものとして $_GET['path'] (18年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 = 大文字小文字を区別しない(パターンに文字がないため、特に必要ない)

L = Last (このRewriteの後に書き換えを停止するので、書き換えのリストの最後にあることを確認する)

QSA = Query String Append (クエリー文字列の追加)。 ?like=penguins のようなものがあった場合、それを残してindex.phpに渡します。