Ubuntu16.4下Apache虚拟主机访问错误显示其他站点内容问题
问题根因
访问内容错乱的核心原因有两个:
- 初始配置中
FIRSTWEBSITE.pl仅绑定了443端口(HTTPS服务),没有配置80端口(HTTP默认端口)的虚拟主机规则 - Apache对同一监听端口的请求,会优先匹配请求头Host对应的
ServerName/ServerAlias,如果没有任何虚拟主机规则匹配上该Host,就会把请求转发给该端口加载顺序最靠前的虚拟主机处理。你初始环境下80端口只有SECONDWEBSITE.pl的虚拟主机规则,所以直接输入firstwebsite.pl访问(默认走HTTP 80端口)时,请求会被直接交给第二个站点处理,返回第二个站的内容。
新增HTTP转HTTPS配置修正
你写的跳转逻辑方向是对的,但有几处需要调整,避免冗余和规则不生效问题:
- 80端口下的这个虚拟主机所有请求都会被跳转到HTTPS,不会实际读取站点目录文件,不需要配置
DocumentRoot参数 - 重写规则末尾要加
[R=301,L]标记,明确返回301永久重定向状态码,同时告知Apache匹配到这条规则后停止执行后续重写规则,避免规则冲突 - 要提前启用Apache的rewrite模块,否则重写规则不会生效
修正后的80端口虚拟主机配置如下:
<VirtualHost *:80> ServerAdmin admin@example.com ServerName FIRSTWEBSITE.pl ServerAlias www.FIRSTWEBSITE.pl RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </VirtualHost>
配置落地校验步骤
改完配置不要直接重启服务,按以下步骤操作避免服务异常:
- 先做配置语法校验,执行命令:
只有命令返回apache2ctl configtestSyntax OK时才能继续后续操作,如果有报错根据提示修正配置即可。 - 确认虚拟主机配置已启用:Ubuntu下Apache的虚拟主机配置需要放在
/etc/apache2/sites-available/目录下,通过a2ensite 配置文件名命令生成软链接到sites-enabled目录才会被加载,不要直接修改配置后跳过启用步骤。 - 启用rewrite模块(如果之前未启用):
a2enmod rewrite - 重载Apache服务让配置生效,优先用reload而不是restart,避免中断正在处理的请求:
systemctl reload apache2 - 校验虚拟主机加载顺序:执行
apache2ctl -S,查看输出的虚拟主机列表,确认80端口下同时存在FIRSTWEBSITE.pl和SECONDWEBSITE.pl两个虚拟主机条目,443端口下存在FIRSTWEBSITE.pl的条目,没有缺失。 - 测试访问前先清空浏览器缓存,301永久重定向会被浏览器本地缓存,之前的错误访问记录可能导致测试结果不准。
内容的提问来源于stack exchange,提问作者Mlody87
相关产品推荐
相关产品推荐

