.htaccess の問題 php $_SERVER['PATH_INFO'] が空です

.htaccess の問題 php $_SERVER['PATH_INFO'] が空です

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

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 の正常な動作を実現するにはどうすればよいかということです。

答え1

ようやく動作するようになりました。新しいRewriteRuleは です。私の ではの代わりにRewriteRule ^(.*)$ index.php?/$1 [L,QSA]を使用しています。$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php

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

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


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

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

すると、index.php次のようになります:

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

注意して$_SERVER['QUERY_STRING']くださいいつも!empty()設定されているため、ではなくをチェックする必要がありますisset()

関連情報