Php

.htaccess 問題 php $_SERVER′磷一個_H一世ñF這′′磷一種噸H一世ñF這′‘PATH_INFO’是空的

  • September 4, 2020

在本地主機上,我正在執行我的 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 的正常行為。

最後我讓它工作了。我的新RewriteRuleRewriteRule ^(.*)$ 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()

引用自:https://serverfault.com/questions/1032282