.htaccess issue php $ _SERVER ['PATH_INFO']が空です[クローズ]
ローカルホストで、.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の通常の動作を実現できるのかということです。
回答
ついに私はそれを機能させました。私の新しい
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()
。