.htaccess 問題 php $_SERVER′磷一個_H一世ñF這′′磷一種噸H一世ñF這′‘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 的正常行為。
最後我讓它工作了。我的新
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]
。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()
。