簡體   English   中英

Apache 響應 404 而不是 403,忽略 F 標志

[英]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]

FR=403之間應該沒有區別。 AFAIK, F只是一個捷徑。


我已經嘗試過Options -MultiViews但我得到了相同的結果

但是,在禁用MultiViews 的情況下,404預期的響應。

禁用 MultiViews 后,如果您請求/pages/pageREQUEST_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.phpfoo.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! 但是FR=403應該導致相同的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM