在同一域上配置 Apache 虚拟主机

在同一域上配置 Apache 虚拟主机

我在 Apache 上配置虚拟主机时遇到了一些问题。我想定义两个不同的子域 aaa.example.com 和 bbb.example.com,它们都使用相同的 IP 地址(两个 DNS 记录都已定义)。我在 CentOS 6.4 上使用 apache v2.2.15。

这是我在 httpd.conf 中创建的配置:

NameVirtualHost *:80

<VirtualHost *:80>
   ServerName aaa.example.com
   ServerAlias example.com
   DocumentRoot /var/www/html
   Redirect / https://aaa.example.com/
</VirtualHost>
<VirtualHost *:80>
   ServerAlias bbb.example.com
   DocumentRoot /var/www/html/bbb
   Redirect / https://bbb.example.com/
</VirtualHost>

但是,我发现的问题是,如果我尝试使用浏览器访问 bbb.example.com,我会从 aaa.example.com 获取页面,但 URL 会被重写为 bbb.example.com。我尝试定义不同的 ServerAlias 指令,并在 NameVirtualHost 和 VirtualHosts 指令中指定 IP 地址,但没有成功。

我已经调查过这个问题问题,但它对我不起作用。

有什么建议么?

提前致谢。

已编辑

根据 GUIDO VACARELLA 的建议做出的改变

我根据 Guido Vaccarella 的建议做了一些修改:

当前配置(部分有效)如下:

NameVirtualHost *:80

<VirtualHost *:80>
ServerName aaa.example.com
DocumentRoot "/var/www/html"
ServerAlias example.com
</VirtualHost>
<VirtualHost *:80>
ServerName bbb.example.com
DocumentRoot "/var/www/html/bbb"
ServerAlias bbb.example.com
</VirtualHost>

此配置适用于两个域。但是,我需要将所有 http 流量重定向到 https(请注意,我省略了重定向),而这不起作用。

有没有办法将所有 http 流量重定向到 https?我尝试为端口 443 复制相同的配置,但是不起作用。

提前致谢。

答案1

Apache .htaccess 文件可以完成将 http 更改为 https 的脏活……

下面是我发现的一个示例,它检查是否带有 www:

RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

答案2

谢谢 Jeff,你的建议很管用。无论如何,我可以让它发挥作用(以更复杂的方式):

NameVirtualHost *:80

<VirtualHost *:80>
ServerName aaa.example.com
DocumentRoot "/var/www/html"
ServerAlias example.com
Redirect / https://aaa.example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName bbb.example.com
DocumentRoot "/var/www/bbb"
ServerAlias bbb.example.com
Redirect / https://bbb.example.com/
</VirtualHost>

NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/apacheaaa.crt
SSLCertificateKeyFile /etc/httpd/ssl/apacheaaa.key
ServerName aaa.example.com
DocumentRoot "/var/www/html"
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/apachebbb.crt
SSLCertificateKeyFile /etc/httpd/ssl/apachebbb.key
ServerName bbb.example.com
DocumentRoot "/var/www/bbb"
</VirtualHost>

感谢 Guido 和 Jeff 的帮助。

相关内容