[英]Apache responds with 404 instead of 403, ignoring F flag
我有這個簡單的項目層次結構:
位於/www
根文件夾的.htaccess
文件的內容是:
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} "\.php$"
RewriteRule .* - [F]
當請求任何.php文件但index.php
時, .htaccess
中的規則應返回403 。 .php模板的內容不相關。
如果我沒記錯的話,如果請求的最后一部分是現有.php文件的名稱並且重寫引擎已打開,則 Apache 無論您是否指定.ZE1BFD762321E409CEE4AC0B6E841部分都會為它服務。 就我而言,如果我注釋掉.htaccess
的最后兩行,則這些網址中的任何一個:
localhost/pages/page
localhost/pages/page/
返回/pages/page.php
的內容
我的問題是,鑒於上述.htaccess
,如果我寫這個 url :
localhost/pages/page.php
我得到了預期的403 。 但如果我寫任何一個:
localhost/pages/page
localhost/pages/page/
我得到404 (not found) 而不是預期的403 。 為什么我得到404 ?
有趣...我可以在 Apache 2.4 上重現此行為,但無法解釋它 - 在我看來它看起來像一個錯誤,因為用R=403
替換F
會產生所需的結果(應該沒有區別) - 見下文。
澄清一下,對於/pages/page
解析為/pages/page.php
首先取決於啟用MultiViews
(如評論中所述)。 或者,您可以使用 mod_rewrite 執行此操作 - 但這里沒有證據。 MultiViews 在 Apache 上默認禁用,但一些共享主機出於某種原因確實啟用了它(它使無擴展 URL “正常工作”)。 但是,MultiViews 是與 mod_rewrite 發生意外沖突的常見原因。 而且,無擴展名 URL“只是(意外地)起作用”這一事實可能會導致規范化的其他問題。
我認為存在“錯誤”的原因是,如果您只是將F
標志更改為R=403
,那么您確實會得到“預期的”403 響應:
RewriteCond %{REQUEST_FILENAME} "\.php$" RewriteRule.* - [R=403]
F
和R=403
之間應該沒有區別。 AFAIK, F
只是一個捷徑。
我已經嘗試過
Options -MultiViews
但我得到了相同的結果
但是,在禁用MultiViews 的情況下,404是預期的響應。
禁用 MultiViews 后,如果您請求/pages/page
, REQUEST_FILENAME
將采用/abs/path/to/pages/page
形式(無.php
擴展名)。 您的條件不匹配,因此請求進入 404。
你最好禁用 MultiViews。 /pages/page
和/pages/page/
“神奇地”解析為/pages/page.php
是不“正常的”。 在這種情況下, /pages/page
和/pages/page/
導致 404 是“正常的”。 如果您使用 mod_rewrite 做很多事情,其中請求的 URL 映射到文件系統,那么您可能會遇到沖突。
請注意,MultiViews 不僅適用於.php
文件。 啟用 MultiViews 后,您就擁有了無擴展的一切。 圖像、腳本、HTML、樣式表等。如果您有多個具有共同基本名稱和 mime 類型的文件,將提供哪個文件? 例如。 foo.php
或foo.html
?
當然,您可以創建 mod_rewrite 指令來啟用此行為 - 但這不是自動的。
更新:一個更簡潔的例子......
給定一個文件/page.php
(在文檔根目錄中)並且 MultiViews 已啟用。
(例如Options +MultiViews
)
請求/page
(或/page/
)導致 MultiViews/ /page.php
通過內部子請求服務 /page.php。
現在,讓我們使用 mod_rewrite 阻止所有訪問並提供 403 Forbidden:
RewriteRule ^ - [F]
這應該使用 403 阻止每個請求。但是,請求/page
或/page/
- 由 MultiViews成功重寫的 URL - 會導致 404 Not Found 響應!
但是,將上述規則更改為使用R
標志:
RewriteRule ^ - [R=403]
現在,一切都返回 403,包括上面提到的兩個 URL! 但是F
和R=403
應該導致相同的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.