通用的大量 vhost 配置會在每個 vhost 請求上導致 404 狀態程式碼
我正在嘗試使用 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
. 對這個問題的任何幫助都會很棒。編輯:正如我在下面對第一個答案的評論中所說的那樣,我需要一個解決方案,它不一定需要
RewriteRule
vhost 配置中的任何內容。因為我使用的是 php 系統,它確實有自己的(有時是真正複雜的)RewriteRule
s,所以我不想在這些.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 -t
並apachectl -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.com
toexample.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 工作,那麼擁有本質上與您的網站重複的內容將是一種阻礙。