![.htaccess 問題 php $_SERVER['PATH_INFO'] 為空](https://rvso.com/image/756877/.htaccess%20%E5%95%8F%E9%A1%8C%20php%20%24_SERVER%5B'PATH_INFO'%5D%20%E7%82%BA%E7%A9%BA%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()
。