VirtualHost总是在Ubuntu 14.04上使用Apache返回默认主机

Sim*_*mon 31 apache ubuntu virtualhost

我尝试在默认设置之外设置虚拟主机localhost.每当我尝试调用我的虚拟主机时,http://test我都会获得位于目录中的默认Apache2索引文件http://localhost.此外,apache在禁用(a2dissite)两个VirtualHost文件和重新加载apache(service apache2 reload)之后仍然返回此页面.

虚拟主机无法正常工作会出现什么问题?

组态:

我的目录结构如下:

/var/www/html                  # Default localhost dir
/var/www/html7index.html       # Apache2 default index

/var/www/test                  # HTML dir for the virtual host
/var/www/test/index.html       # My "website" 
Run Code Online (Sandbox Code Playgroud)

内容/etc/hosts:

127.0.0.1       localhost
127.0.1.1       Laptop
127.0.0.1       test
Run Code Online (Sandbox Code Playgroud)

目录内容/etc/apache2/sites-available:

000-default.conf
default-ssl.conf
test.conf
Run Code Online (Sandbox Code Playgroud)

档案000-default.conf:

<VirtualHost localhost:80>
        ServerName localhost
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

档案test.conf:

<VirtualHost test:80>
        ServerAdmin test@localhost
        ServerName test
        NameVirtualHost test
        ServerAlias test
        DocumentRoot /var/www/test
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

Edu*_*nis 53

我遇到了这个问题,事实证明我必须禁用默认的虚拟主机.

sudo a2dissite 000-default.conf
Run Code Online (Sandbox Code Playgroud)

可能的扩展:

根据apache文档深入讨论虚拟主机匹配:

[...]如果主服务器此时没有ServerName,则使用运行httpd的计算机的主机名.

这意味着如果默认vhost(通常为000-default.conf)没有设置ServerName(这是默认设置),Apache将回退到操作系统的主机名.

因此,Apache会从默认的vhost(000-default.conf)中选择并提供服务,即使配置了与服务器主机名具有相同ServerName的另一个用户创建的vhost也是如此.

原因是Apache按文件名的字母顺序对vhost进行排序,并选择与请求的HTTP Host头匹配的第一个vhost配置.因此,在用户定义的vhost之前检查000-default.conf,因为它们通常没有前缀000-.

  • 这对我有用。但我讨厌没有解释的解决方案。为什么 Apache 不跟随我的虚拟主机而是加载默认的虚拟主机?完全没有意义。 (2认同)

Sim*_*mon 43

tl; dr:sudo调用它:sudo service apache2 reload


看起来像service apache2 reload愚弄我的行为.请参阅以下日志:

user@Laptop:/etc/apache2/sites-available$ sudo a2ensite test.conf 
Enabling site test.
To activate the new configuration, you need to run:
  service apache2 reload
user@Laptop:/etc/apache2/sites-available$ service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$
Run Code Online (Sandbox Code Playgroud)

尝试达到http://test:不工作

user@Laptop:/etc/apache2/sites-available$ sudo service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$
Run Code Online (Sandbox Code Playgroud)

尝试达到http://test:工作

所以,找到差异!关键是我认为它首先会正确重新加载.日志文件中也没有条目.打电话给它有sudo帮助.这是一个错误吗?

  • 哦,花了好几个小时.它应该抛出错误:( (4认同)
  • 也清除浏览器缓存。我被发送到我的默认站点,它通过那里的 .htaccess 重定向我。这意味着,即使我确实使用了 sudo,我的浏览器仍然决定重定向我。清除缓存修复了它。 (3认同)

Phi*_*l_t 6

只是指出这一点对于有经验的用户来说可能是显而易见的,但如果你是第一个计时器则不是很明显.

确保您使用的配置以您的预期/sites-enabled结束.confapache2.conf

这是我的问题,它修复了它.


小智 5

如果您已经尝试过以下操作:
1. 检查文档根目录和父文件夹的权限。
2. a2dissite 000-default 等
3. 使用 sudo service apache2 reload 重新启动 apache
但它仍然无法正常工作,然后执行以下操作:

1. 启用调试日志:
vi /etc/apache2/apache2.conf
LogLevel debug

2. 重新启动 apache2 并监控日志
sudo service apache2 restart
tail -f /var/log/apache2/*.log

3. 注意服务器的 IP 是否按预期显示在日志中:

==> /var/log/apache2/other_vhosts_access.log <== ip-xxx-xx-xx-xx.eu-west-2.compute.internal:80 xx.78.xx.2xx - - [13/Sep /2017:18:40:44 +0100] "GET / HTTP/1.1" 200 3509 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0"

您会注意到,
我有一些 FQDN,例如“ip-xxx-xx-xx-xx.eu-west-2.compute.internal:80” ,而不是像典型 IP 地址那样的 xxx.xx.xx.xx:80 "
我正在使用 AWS 弹性 IP 为我的 Amazon EC2 Web 服务器创建一个固定 IP。

4. 检查你的虚拟主机 .conf 文件的头部

<VirtualHost 127.0.0.1:80 11.22.33.44:80>
# Added from nessus to make more secure
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
ServerName mydomain.com
...
Run Code Online (Sandbox Code Playgroud)

好的,所以我们在这里看到的是我们告诉 Apache 为来自 127.0.0.1 或 11.22.33.44 端口 80 的请求提供服务。尤里卡!

解决方案:
将 *:80 添加到 VirtualHost 标记中,如下所示:

<VirtualHost 127.0.0.1:80 11.22.33.44:80 *:80>
Run Code Online (Sandbox Code Playgroud)


并重新启动apache。我希望这有帮助。可能还有其他原因,但如果这是导致您问题的原因,那么是时候坐下来喝杯茶放松一下了!如果没有,那么我希望你找到解决方案。

附注。请记住将日志放回警告而不是调试!

  • 如果你放了 `*:80`,其他的都是多余的。`&lt;VirtualHost *:80&gt;` 就足够了。 (2认同)