为了为域和子域声明 VirtualHost,Apache2,Ubuntu
Order to declare VirtualHost for domain and subdomains, Apache2, Ubuntu
我在我的 DNS 中声明了我的 domain
、subdomain1
和 subdomain2
,一切正常。
然后我像这样创建我的目录:
/var/www/domain.com/public_html/index.html
/var/www/subdomain1.domain.com/public_html/index.html
/var/www/subdomain2.domain.com/public_html/index.html
然后我创建:/etc/apache2/sites-available/domain.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.subdomain1.domain.com
ServerAlias www.subdomain1.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/subdomain1.domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.subdomain2.domain.com
ServerAlias www.subdomain2.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/subdomain2.domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias www.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我禁用默认配置:sudo a2dissite 000-default.conf
然后我激活每个网站:sudo a2ensite domain.conf
我重新启动 Apache 2:sudo systemctl restart apache2.service
问题是所有链接都指向第一个声明的 VirtualHost,即使我将 VirtualHost 声明分开在单独的 .conf
文件中,它也将始终是目录中将为所有人打开的第一个 VirtualHost DNS 域。
Apache 将尝试将请求的域与它知道的 VirtualHost 之一相匹配。当找不到匹配项时,它将使用它读取的第一个,在配置中从上到下。因此,在这里,您的域未被 Apache 识别,而您始终获得第一个。
我稍微修改了你的配置:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.subdomain1.example.com
ServerAlias subdomain1.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/subdomain1.example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/sub1_error.log
CustomLog ${APACHE_LOG_DIR}/sub1_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.subdomain2.example.com
ServerAlias subdomain2.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/subdomain2.example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/sub2_error.log
CustomLog ${APACHE_LOG_DIR}/sub2_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example_error.log
CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>
详情:
NameVirtualHost
仅当您 运行 Apache 2.2 时才需要。 >2.4,是自动的,不用放,反正都能用
ServerAlias
用于定义适用于此 VirtualHost
的 另一个 域名。如果你定义ServerAlias
== ServerName
,那是没有用的
- 因此,
ServerAlias
现在配置了域名,没有“www.”
- 拆分日志文件。如果你有 3 个 VH 指向相同的日志,调试起来会很麻烦。拆分时更容易。
所以有了这个配置...
http://www.subdomain1.example.com
和http://subdomain1.example.com
会去第一个VH
- 类似于子域 2
- 和
http://www.example.com
和http://example.com
会用第三个
这是基于你的问题和你说你尝试过的评论 example.com
。在您的配置中,example.com
未在任何地方列出(即 www.example.com
!= example.com
)。
我在我的 DNS 中声明了我的 domain
、subdomain1
和 subdomain2
,一切正常。
然后我像这样创建我的目录:
/var/www/domain.com/public_html/index.html
/var/www/subdomain1.domain.com/public_html/index.html
/var/www/subdomain2.domain.com/public_html/index.html
然后我创建:/etc/apache2/sites-available/domain.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.subdomain1.domain.com
ServerAlias www.subdomain1.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/subdomain1.domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.subdomain2.domain.com
ServerAlias www.subdomain2.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/subdomain2.domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias www.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/domain.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我禁用默认配置:sudo a2dissite 000-default.conf
然后我激活每个网站:sudo a2ensite domain.conf
我重新启动 Apache 2:sudo systemctl restart apache2.service
问题是所有链接都指向第一个声明的 VirtualHost,即使我将 VirtualHost 声明分开在单独的 .conf
文件中,它也将始终是目录中将为所有人打开的第一个 VirtualHost DNS 域。
Apache 将尝试将请求的域与它知道的 VirtualHost 之一相匹配。当找不到匹配项时,它将使用它读取的第一个,在配置中从上到下。因此,在这里,您的域未被 Apache 识别,而您始终获得第一个。
我稍微修改了你的配置:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.subdomain1.example.com
ServerAlias subdomain1.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/subdomain1.example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/sub1_error.log
CustomLog ${APACHE_LOG_DIR}/sub1_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.subdomain2.example.com
ServerAlias subdomain2.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/subdomain2.example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/sub2_error.log
CustomLog ${APACHE_LOG_DIR}/sub2_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example_error.log
CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>
详情:
NameVirtualHost
仅当您 运行 Apache 2.2 时才需要。 >2.4,是自动的,不用放,反正都能用ServerAlias
用于定义适用于此VirtualHost
的 另一个 域名。如果你定义ServerAlias
==ServerName
,那是没有用的- 因此,
ServerAlias
现在配置了域名,没有“www.” - 拆分日志文件。如果你有 3 个 VH 指向相同的日志,调试起来会很麻烦。拆分时更容易。
所以有了这个配置...
http://www.subdomain1.example.com
和http://subdomain1.example.com
会去第一个VH- 类似于子域 2
- 和
http://www.example.com
和http://example.com
会用第三个
这是基于你的问题和你说你尝试过的评论 example.com
。在您的配置中,example.com
未在任何地方列出(即 www.example.com
!= example.com
)。