2010-07-15 62 views
6

如果我在.htaccess文件中設置DirectorySlash Off並調用目錄結尾的斜線我從服務器獲取的403-Forbidden。如果我用斜線調用它,一切正常。阿帕奇DirectorySlash關 - 網站打破

任何人都可以解釋爲什麼嗎?下面是我的完全匿名.htaccess

# GLOBAL CONFIG 
Options +FollowSymlinks 
DirectorySlash Off 
AddDefaultCharset utf-8 
php_value post_max_size 256M 
php_value upload_max_filesize 256M 

# BEGIN WordPress 
RewriteEngine On 
RewriteBase /folder/ 
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /folder/index.php [L] 
# END WordPress 

# REMOVE WWW 
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com$ [NC] 
RewriteRule ^(.*)$ http://domain.com$1 [R=301,L] 

回答

11

當你每文檔知道,當DirectorySlash設置爲Off,請求/folder沒有DirectoryIndex評估。這意味着請求不會自動映射到/folder/index.php

mod_dir在請求處理的「修正」階段執行此項檢查。 mod_rewrite負責您的RewriteRule定義,當您在.htaccess文件中指定規則時,還會在此階段執行處理。

然而,它被編程爲模塊的知名度,如mod_dir,並且包含一個檢查以確保當前目錄被要求用尾部斜線。如果不是,它拒絕處理請求,因爲這樣做可能會導致未定義的行爲。

該請求然後轉移到內容生成階段,由於請求未映射到真實文件,因此該請求由mod_autoindex處理。鑑於Indexes在您的主機上默認爲禁用,mod_autoindex返回403 Forbidden這就是你所看到的。

注意,因爲DirectoryIndex不計算,即使mod_rewrite來處理請求時,它仍然會失敗,因爲沒有自動分辨率index.php會發生,您的規則

RewriteRule . /folder/index.php [L] 

止跌」 t匹配,因爲.需要匹配某項內容(但請求將爲空)。

啓用DirectorySlash通過糾正前面提到的所有場景的阻止行動,除了最後一個音符,這是由DirectoryIndex請求index.php映射反正事實照顧防止這種情況。

+0

非常感謝!如果我閱讀你的答案,也容易理解。 – gearsdigital 2010-07-18 05:03:18

+0

但是如果我們想要混淆我們的目錄結構並且仍然使用'mod_rewrite'來處理每個請求呢?假設我有一個擁有'/ private'目錄的網站。如果'DirectorySlash'爲'On',如果我請求'/ private',Apache會將我重定向到'/ private /',從而讓信息泄露進來。如果我只想發送'/ private'到我的'索引處怎麼辦? PHP的前端控制器? – tonix 2016-05-08 17:22:28

2

我想是因爲當你打開DirectorySlash關閉,它禁用URL的自動校正,並試圖顯示目錄列表中,但幸運的是,你可能已經停用了這個地方(或文件權限),所以它發送一個403-Forbidden。我想,當你打開它,它正常工作。 從我從文檔中瞭解的情況來看,使用DirectorySlash關閉安全性並不是很好。 http://httpd.apache.org/docs/2.1/mod/mod_dir.html

+0

洛朗,感謝您的回答。我已經閱讀了apache文檔中的**安全警告**,但我需要了解這裏出了什麼問題。 順便說一下,在我的虛擬主機後端默認禁用了目錄列表。 – gearsdigital 2010-07-15 19:25:56

+0

你'rewriteBase是/ folder /',所以你需要結尾的斜線來匹配url。你可以將它設置爲'/ folder',我認爲它應該沒有結尾的斜槓。 – laurent 2010-07-15 19:35:45

+0

如果我按照你的建議,我也會得到403。 – gearsdigital 2010-07-15 20:06:29

8

使用Apache 2.4,您可以通過設置RewriteOptions AllowNoSlash來允許在.htaccess文件中進行重寫。

Changes with Apache 2.3.16 
... 
*) mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible 
    for RewriteRules to be placed in .htaccess files that match the directory 
    with no trailing slash. PR 48304. 
    [Matthew Byng-Maddick <matthew byng-maddick bbc.co.uk>] 
... 

Apache documentation of mod_rewrite