Apache-2.4

%{REQUEST_FILENAME}.ext 是什麼意思?為什麼額外的 .ext 結尾?

  • November 27, 2021

%{REQUEST_FILENAME}包含這樣的字元串:

/web/webroot/index.php

我看到很多人建議測試一個文件是否存在並且具有這樣的 .php 副檔名:

RewriteCond %{REQUEST_FILENAME}.php -f

.php後面不是%{REQUEST_FILENAME}多餘的嗎?變數應該已經包含.php,對吧?

似乎添加.phpafter%{REQUEST_FILENAME}會使 TestString 檢查添加一個額外的 .php,如下所示:

/web/webroot/index.php.php

我錯過了一些簡單的東西,我很確定,但我只是不知道它是什麼。

上下文是這樣的:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

.php後面不是%{REQUEST_FILENAME}多餘的嗎?變數應該已經包含.php,對吧?

好吧,是也不是,這取決於您要做什麼。

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

此規則允許您請求無副檔名的 URL。例如。/indexor/foo並且這在內部將請求分別重寫為/index.php/foo.php

在本例中,REQUEST_FILENAME是一個形式為 的字元串/web/webroot/index。因此,它是/web/webroot/index.php在重寫之前存在的測試。如果您要請求/index.php,則條件失敗並且不會發生重寫(這是正確的)。

但是,此規則並不完全正確,並且在某些情況下可能會導致重寫循環。請參閱以下相關問題:

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