![.htaccess の問題 php $_SERVER['PATH_INFO'] が空です](https://rvso.com/image/756877/.htaccess%20%E3%81%AE%E5%95%8F%E9%A1%8C%20php%20%24_SERVER%5B'PATH_INFO'%5D%20%E3%81%8C%E7%A9%BA%E3%81%A7%E3%81%99%20.png)
ローカル ホストでは、ファイルに次のルールを設定して 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()
。