Apache-Httpd

通用的大量 vhost 配置會在每個 vhost 請求上導致 404 狀態程式碼

  • May 3, 2017

我正在嘗試使用 ServerAlias 設置具有大量子域的 apache 2.4 伺服器。主域的基本配置工作正常(主域 => 200,所有子域 => 404):

UseCanonicalName Off

<VirtualHost example.com>
       ServerName example.com
       ServerAlias www.example.com
       VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
       DirectoryIndex index.php index.html

       <Directory />
               Options +Indexes +FollowSymLinks +Includes
               <IfModule !mod_access_compat.c>
                       Require all granted
               </IfModule>
               <IfModule mod_access_compat.c>
                       Order allow,deny
                       Allow from all
               </IfModule>
               AllowOverride All
       </Directory>
</VirtualHost>

但是,當我為我的通用虛擬主機設置添加這些行時,Web 伺服器會在每個虛擬主機(子域)請求上返回一個 404 狀態程式碼:

UseCanonicalName Off

<VirtualHost example.com>
       ServerName example.com
       ServerAlias www.example.com
       VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
       DirectoryIndex index.php index.html
       ServerAlias *.example.com
       VirtualDocumentRoot "/var/www/vhosts/example.com/%1.0"
       DirectoryIndex index.php index.html

       <Directory />
               Options +Indexes +FollowSymLinks +Includes
               <IfModule !mod_access_compat.c>
                       Require all granted
               </IfModule>
               <IfModule mod_access_compat.c>
                       Order allow,deny
                       Allow from all
               </IfModule>
               AllowOverride All
       </Directory>
</VirtualHost>

我認為它必須對正確的文件夾路徑做一些事情。文件夾路徑始終如下所示:

/var/www/vhosts/maindomain.com/subdomain.maindomain.com

我需要的只是一個匹配主域和與之關聯的通用子域的配置。所以,

www.example.com
example.com

匹配文件夾路徑:

/var/www/vhosts/example.com/httpdocs

ci.example.com
tracker.example.com
other.example.com

應該與其文件夾路徑匹配,如下所示:

/var/www/vhosts/example.com/ci.example.com
/var/www/vhosts/example.com/tracker.example.com
/var/www/vhosts/example.com/other.example.com

另外,由於某些奇怪的原因,如果我將其更改為%0.0在子域路徑中,子域可以工作,但主域不能。因此,使用它時,情況正好相反。主域 => 404,所有子域 => 200。

我在 apache 2.4 文件中找到了文件夾名稱的魔術字元串文字的解釋:http ://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html 但它並沒有解決我的問題,而是讓我越來越困惑…

Web 伺服器在 openSUSE 42.2 最小版本下執行。正如您可能已經建議的那樣,真實域名在此處更改為example.com. 對這個問題的任何幫助都會很棒。

編輯:正如我在下面對第一個答案的評論中所說的那樣,我需要一個解決方案,它不一定需要RewriteRulevhost 配置中的任何內容。因為我使用的是 php 系統,它確實有自己的(有時是真正複雜的)RewriteRules,所以我不想在這些.htaccess東西上遇到麻煩。但任何其他選擇,除了cgi是可能的。是的,符號連結支持已啟用(或可能啟用它)。


編輯:

符號連結範例幫助我了解了基本概念。稍微重新思考一下,我就想到了下面的這個解決方案。首先找到的規則總是適用的,所以它對我有用:

UseCanonicalName Off
<VirtualHost *:80>
       DocumentRoot "/var/www/vhosts/example.com/httpdocs"
       ServerName www.example.com
       ServerAlias example.com
       <Directory />
               Options Indexes FollowSymLinks Includes ExecCGI
               AllowOverride All
               Require all granted
               Allow from all
       </Directory>
</VirtualHost>

<VirtualHost *:80>
       DocumentRoot "/var/www/vhosts/example.com/httpdocs"
       ServerName example.com
       ServerAlias *.example.com
       VirtualDocumentRoot "/var/www/vhosts/example.com/%1"
       <Directory />
               Options Indexes FollowSymLinks Includes ExecCGI
               AllowOverride All
               Require all granted
               Allow from all
       </Directory>
</VirtualHost>

apachectl -tapachectl -S說這沒關係。測試和工作!:-)

嘗試

<VirtualHost *:80>
   ServerName example.com
   DocumentRoot /var/www/vhosts/example.com/httpdocs
   ServerAlias *.example.com
   VirtualDocumentRoot /var/www/vhosts/example.com/%0
</VirtualHost>

這顯然不包括整個配置,但它應該讓您的萬用字元子域正常工作。

接下來,我會將所有請求重定向到www.example.comto example.com。最簡單的方法可能是在內部使用 htaccess 文件/var/www/vhosts/example.com/www.example.com

或者,如果你有符號連結,你可以符號連結/var/www/vhosts/example.com/www.example.com/var/www/vhosts/example.com/httpdocs

編輯:

如果您不想在.htaccess. 試試這個:

<VirtualHost *:80>
   ServerName example.com
   DocumentRoot /var/www/vhosts/example.com/httpdocs
   ServerAlias *.example.com
   VirtualDocumentRoot /var/www/vhosts/example.com/%0
   RewriteEngine on
   RewriteCond %{HTTP_HOST} ^www.example.com
   RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

如果沒有某種重定向,我不知道有任何方法可以做到這一點。附帶說明一下,將非 www 重定向到 www 或將 www 重定向到非 www 是一種很好的做法。如果您打算進行任何 SEO 工作,那麼擁有本質上與您的網站重複的內容將是一種阻礙。

引用自:https://unix.stackexchange.com/questions/359566