Apache2

AllowOverride 不適用於別名站點

  • September 26, 2020

我有兩個域johny.comalice.com一個管理它們的網路伺服器(apache)。Web 文件位於/var/www/johny.com和中,/var/www/alice.com並被配置為兩個具有適當ServerNameDocumentRoot. 現在,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 Error alice.com,而不是 on john.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_proxymod_proxy_http,但它會滿足您對這個特定案例的要求,儘管我會小心依賴Location指令,因為文件在詳細描述方面做得很好

引用自:https://serverfault.com/questions/1035427