AllowOverride 不適用於別名站點
我有兩個域
johny.com
和alice.com
一個管理它們的網路伺服器(apache)。Web 文件位於/var/www/johny.com
和中,/var/www/alice.com
並被配置為兩個具有適當ServerName
和DocumentRoot
. 現在,Alice 想要保護她在網路上的一個文件不被任何人看到。她介紹了一個.htaccess
文件,內容如下<Files "private.txt"> Require all denied </Files>
並且還在她的虛擬主機的 apache 配置中添加了以下內容
<Directory /var/www/alice.com> Options Indexes FollowSymLinks AllowOverride All </Directory>
並且沒有人可以訪問
alice.com/private.txt
. 到現在為止還挺好。現在 John 決定通過更改他的 vhost apache 配置來為 Alice 的 web 提供一個別名
Alias "/alice" "/var/www/alice.com"
任何人都可以在 上看到 Alice 的網頁
john.com/alice
。但是任何人也可以看到愛麗絲私人文件的內容。
alice.com/private.txt
給出 403 禁止。
john.com/alice/private.txt
顯示文件的內容。這是怎麼回事?不通過指令
AllowOverride
傳播?Alias
我們應該如何解決這個問題?阿帕奇版本是Apache/2.4.38 (Debian)
. 將亂碼放入.htaccess
文件中只會在 500 Internal Server Error 上給出 500 Internal Server Erroralice.com
,而不是 onjohn.com/alice
,所以似乎.htaccess
根本不考慮別名。
問題是目錄缺少
AllowOverride All
指令/var/www/alice.com
。具體來說,問題出在這裡:(強調我的)
並且還在她的虛擬主機的 apache 配置中添加了以下內容
由於您在 Alice 的虛擬主機塊中定義了這些目錄權限,因此它們不適用,
john.com/alice
因為沒有通過<VirtualHost>
與 Alice 對應的塊的上下文訪問該目錄。就伺服器而言,別名正在合法地訪問文件系統中的某個目錄。碰巧它與不同虛擬主機的根目錄相同。從文件中:
節內的節在虛擬主機定義之外的相應節之後應用。這允許虛擬主機覆蓋主伺服器配置。
但是,由於它與您的特定情況有關,重要的是要注意,只有
VirtualHost
在實際呼叫與所討論的部分相對應的上下文時才會真正發生這種情況,而不是在這裡。有幾種方法可以解決此問題。最簡單的方法是在伺服器上下文中簡單地聲明
AllowOverride All
指令(即..不在 a 、甚至另一個塊中。VirtualHost``.htaccess``Directory
<Directory "/var/www/alice.com"> Options Indexes FollowSymLinks Require all granted AllowOverride All </Directory>
再次注意,因為您正在聲明
AllowOverride All
,所以您現在可以在該目錄中的文件中修改這些設置.htaccess
,而不管從哪個VirtualHost
上下文訪問該目錄。如果您想變得花哨,並且在
/var/www/alice.com
從的虛擬主機上下文中訪問時死心塌地,您總是可以將uri 配置為’d to 。john.com``alice.com``john.com/alice``ProxyPass``http://alice.com
<VirtualHost "*:80"> ... <Location "/alice"> ProxyPreserveHost Off ProxyPass http://alice.com/ </Location> </VirtualHost>
您需要啟用
mod_proxy
和mod_proxy_http
,但它會滿足您對這個特定案例的要求,儘管我會小心依賴Location
指令,因為文件在詳細描述方面做得很好。