Apache 中無法存取「私有」目錄

Apache 中無法存取「私有」目錄

目錄private位於我的 DocumentRoot 下,儘管它的名稱如此,但它應該像任何其他目錄一樣可以存取。但是如果我將以下內容新增RewriteRule到 httpd.conf 中:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache 回傳 403http://伺服器/私人/2201。錯誤日誌指出

client denied by server configuration: /private/2201.html

如果我隨後重命名privatefoo,或直接要求 2201.html,則將提供該文件:

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

這很令人困惑。對於名為 的目錄有什麼特殊規則嗎private?如果是這樣 - 為什麼對 2201.html 的直接請求有效(儘管被拒絕的請求似乎處理相同的資源,至少根據錯誤日誌條目)?

答案1

Apache 或 mod_rewrite 中沒有內建任何東西來讓這個名字變得private特別,AFAIK。但是,您的配置可能附帶一個以不同方式處理該名稱的預設規則。嘗試 grep 您的配置以查找單字private,例如

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

如果您找到匹配的 RewriteRule,那就是您的罪魁禍首。

您的日誌條目明確表明是名稱private導致了問題,並且一定是 RewriteRule 導致請求被拒絕。

答案2

這是RTM的一個尷尬案例。 Apache 的相關文檔重寫規則明確指出替換字串“將被視為 URL 路徑,除非根目錄或文件系統中存在名為 www 的目錄,在這種情況下它將被視為文件系統路徑”,至少在定義 RewriteRule 時在目錄上下文之外。

由於我的檔案系統包含/private,但不包含/foo,且 URL/private/2212.html不受 RewriteRule 影響,因此上面的模式應該是預期的。

解決方案是添加標誌[PT](直通)到我的 RewriteRule。

相關內容