.htaccess issue php $ _SERVER ['PATH_INFO']が空です[クローズ]

Sep 01 2020

ローカルホストで、.htaccessファイルに次のルールを使用してphp(MVC)アプリケーションを実行していました。

Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(config|core|css|js|fonts|images|robots\.txt) RewriteRule ^(.+)$ index.php/$1 [L]

たとえばlocalhost/myapp/register/login、ログインページをロードします。しかし、ライブサーバーでは、問題が発生しています。私が直面した最初の問題はでしたNo input file specified。この答えを読んで、私はこの行RewriteRule ^(.+)$ index.php/$1 [L]をに変更しましたRewriteRule ^(.*)$ index.php?/$1 [L]。これにより最初の問題は解決しましたが、別の問題が発生し、URLが何であっても、常に同じ/デフォルトのビューとコントローラーが読み込まれます。

私のindex.phpには次のコード行があります。

$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
 // Route the request
 Router::route($url);

そこで、$ _ SERVER ['PATH_INFO']の値を確認しましたが、空です。今私の質問は、なぜそれが空であるのか、そしてどうすればURLの通常の動作を実現できるのかということです。

回答

MrWhite Sep 03 2020 at 17:03

ついに私はそれを機能させました。私の新しいRewriteRuleはです。の代わりに使用しています。RewriteRule ^(.*)$ index.php?/$1 [L,QSA]$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php

$_SERVER['REQUEST_URI']PHPコードで使用している場合は、おそらくクエリ文字列(URLパスを含む)をRewriteRule 置換に追加するべきではありません(少なくとも必要ありません)。RewriteRule . index.php [L]代わりに使用してください。

$_SERVER['REQUEST_URI']PHPスーパーグローバルは、関係なく、あなたの要求されたURLパスが含まれていますRewriteRuleディレクティブ。これには、潜在的なクエリ文字列も含まれています(厳密に言えば、PHPコードで分割する必要があります)。(URLパスのみを含む同じ名前のApacheサーバー変数とは異なります。)


代わりに、「変更された」のようにクエリ文字列を渡すことを選択したRewriteRule場合は、スラッシュプレフィックスを追加する必要はないようです(PHPコードでこれを削除しているため)。例えば:

RewriteRule (.*) index.php?$1 [QSA,L]

次に、index.php次のようになります。

$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];

$_SERVER['QUERY_STRING']常に設定されているため!empty()、ではなく、を確認する必要があることに注意してくださいisset()