2013-04-10 158 views
4

我想更加詳細地瞭解下面的htaccess的規則:是否可以通過PHP訪問REQUEST_FILENAME?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC] 
    RewriteRule (.+) index.php?p=$1 [QSA,L] 
</IfModule> 

具體來說,我想了解REQUEST_FILENAME是如何工作的。我發現有幾個資源討論這個問題,從mod_rewrite文檔到堆棧溢出的答案。但是,似乎沒有人正在處理我正在尋找的內容,我該如何仔細查看REQUEST_FILENAME變量才能看到它的值?

通常,當我想看看在.htaccess中引用的變量之中,我將使用的print_r看$ _ SERVER全球,看看有什麼事情服務器這些值是:

echo "<pre>"; 
print_r($_SERVER); 
echo "</pre>"; 
die('fin'); 

,可以幫我看看上面的$ _SERVER ['REQUEST_URI']這樣的值。但似乎REQUEST_FILENAME在當前環境中的任何PHP $ GLOBALS中都不可用。我確實看到了SCRIPT_FILENAME的值,並且有幾個消息來源表示這兩個值是相等的,但不清楚它們是否是替代值,或者如果REQUEST_FILENAME回退到SCRIPT_FILENAME(如果第一個不存在)。

我已經能夠輸出通過在URL中略微更新htaccess的規則輸出值,將最後一行的REQUEST_FILENAME值:

RewriteRule (.+) index.php?p=%{REQUEST_FILENAME} [R=302,QSA,L] 

但是爲什麼在任何地方沒有這個值可用PHP?有什麼我可以忽略,可以幫助我理解這個變量的存儲位置以及如何通過PHP查看它的值?

+0

謝謝馬克。我認爲我接近這個問題有點不同,但這個答案也有幫助。我發現PHP設置的討論很有幫助。 – 2013-04-11 01:41:34

+1

+1重新打開。報告的重複內容是關於'REQUEST_URI'的,而這個問題解決了'REQUEST_FILENAME',這是一個完全不同的野獸。 – 2013-04-11 10:14:56

+0

對於它的價值,我最初的搜索是專門關於REQUEST_FILENAME的,它的行爲對於有設計背景的人來說並不明顯。雖然有更多經驗豐富的Apache或Web服務器的人可能能夠在這兩個問題之間建立聯繫,但對我來說並不明顯,而Olaf的答案實際上是幫助我從我接近它的方向理解它的那個人。 – 2013-04-11 16:27:00

回答

4

RewriteCond

REQUEST_FILENAME
完整的本地文件系統中的文件路徑或腳本匹配的要求,如果這已經由當時REQUEST_FILENAME服務器確定被引用。否則,例如在虛擬主機上下文中使用時,其值與REQUEST_URI相同。根據AcceptPathInfo的值,服務器可能僅使用REQUEST_URI的某些主要組件將請求映射到文件。

$_SERVER

'SCRIPT_FILENAME'
當前執行腳本的絕對路徑。

如果REQUEST_URI實際上與現有文件相對應,這將是相同的(腳本的完整路徑)。

如果不是,REQUEST_FILENAME將只是REQUEST_URISCRIPT_FILENAME將是執行的PHP腳本的名稱。 $_SERVER['REQUEST_URI']將是REQUEST_FILENAME(又名REQUEST_URI)。

在你的情況,SCRIPT_FILENAME永遠是/path/to/index.phpREQUEST_FILENAME/REQUEST_URI將可以訪問通過$_SERVER['REQUEST_URI']

更新

REQUEST_URI永遠不會成爲一個文件名,因爲它缺少文檔根目錄前綴。當您使用

RewriteCond %{REQUEST_URI} !-f 

即使所請求的URL與現有文件匹配,條件也將始終爲真。以下RewriteRule將始終執行,儘管它應該調用另一個PHP腳本或提供HTML,CSS或圖像文件。

更新

要真正回答這個問題。

但爲什麼在PHP的任何地方都沒有這個值?

REQUEST_FILENAME在PHP中不可用,因爲它不在環境中或請求的標題中。

您可以在PHP中看到的所有東西都是一些環境變量或頭文件或PHP可以推導出來的東西。由於PHP不會嘗試或無法在請求URI和某個文件名之間建立連接,因此無法在任何地方訪問它。畢竟,REQUEST_FILENAME可能在文件系統中的任何地方。

你可以,但是,把它放在自己的環境

RewriteRule (.+) index.php?p=$1 [QSA,L,E=REQUEST_FILENAME:%{REQUEST_FILENAME}] 

和訪問它在PHP作爲$_SERVER['REDIRECT_REQUEST_FILENAME']

+0

謝謝奧拉夫。你的回答幫助我把握它。那麼爲什麼這個htaccess規則使用REQUEST_FILENAME而不是僅僅使用REQUEST_URI?如果我更新規則來使用REQUEST_URI來代替REQUEST_FILENAME,它會錯誤地出現,所以看起來REQUEST_URI不能用於測試文件或目錄,即使值相同,它們都是RewriteCond指令的一部分。 – 2013-04-11 01:38:29

相關問題