如何调试Apache2虚拟主机

Mik*_*ika 3 debian apache-2.4

我在一台服务器上托管两个网站。每个都定义了自己的 VirtualHost。第一个站点运行良好,但是当我尝试访问第二个站点时,我被重定向到第一个站点。就像 Apache 无法通过 ServerName 识别正确的 VirtualHost 并将我重定向到默认(第一个)站点。

是否有日志或其他东西可以让我看到 Apache 在处理我的请求时正在采取哪些步骤?当它试图找到匹配的 VirtualHost 时,它是否会在任何地方记录它使用的 ServerName?

更新:

我为我的第二个站点的子域添加了一个 VirtualHost 部分,并且有效。当我在浏览器中输入“interface.domain.com”时,它会从在 8501 端口中运行的正确应用程序服务器呈现页面。但是当我尝试“www.domain.com”时,它会重定向到我的第一个站点。

下面是我的第二个站点的虚拟主机文件。

<VirtualHost *:80>
  ServerName www.domain.com
  DocumentRoot /home/domain/current/public

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://localhost:8501/$1 [P]
</VirtualHost>

<VirtualHost *:80>
  ServerName interface.domain.com
  DocumentRoot /home/domain/current/public

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://localhost:8501/$1 [P]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

apache2ctl -S

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 1.2.3.4. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
1.2.3.4:443        www.domainfirst.com (/etc/apache2/sites-enabled/https_www_domainfirst_com.conf:1)
1.2.3.4:80         is a NameVirtualHost
         default server domainfirst.com (/etc/apache2/sites-enabled/domainfirst_com.conf:1)
         port 80 namevhost domainfirst.com (/etc/apache2/sites-enabled/domainfirst_com.conf:1)
         port 80 namevhost www.domainfirst.com (/etc/apache2/sites-enabled/www_domainfirst_com.conf:1)
*:80                   is a NameVirtualHost
         default server domain.com (/etc/apache2/sites-enabled/domain_com.conf:1)
         port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain_com.conf:1)
         port 80 namevhost www.domain.com (/etc/apache2/sites-enabled/www_domain_com.conf:1)
         port 80 namevhost interface.domain.com (/etc/apache2/sites-enabled/www_domain_com.conf:10)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl 
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
Run Code Online (Sandbox Code Playgroud)

解决方案:

清除浏览器缓存。我的浏览器缓存了一个规则来将请求转发到另一个站点。

Unb*_*ver 5

难道不是在你的端口定义:混合IP:端口和*<VirtualHost>的标签,除非你是一个非常有经验的Apache管理员,知道自己在做什么。

1.2.3.4无论使用哪个主机名,任何解析为(在您的示例中)的域都将由绑定到 1.2.3.4:80 的域提供服务。

如果您的 *:80 虚拟主机中的服务器名称和服务器别名没有解析为 1.2.3.4,则说明有其他问题。如果他们确实解析到此 IP,只需将您更改<VirtualHost 1.2.3.4:80><Virtualhost *:80>

补充说明:如果你的服务器上只有1个IP,只使用*:port版本,这样可以避免混淆

更多评论:部分问题可能是您清理所有域名的方式。这必须始终如一地进行,否则我们的努力将是徒劳的。apache 决定向哪个服务器发送请求的方式如下。这只是简单的工作,这个过程中的任何错误都无法生存,即使是对 Apache 版本的最基本测试:

  • 如果连接到特定 IP 地址并且 apache 具有<VirtualHost>该 IP/端口的单个匹配标记,则该虚拟主机将接收请求
  • 如果没有,apache 会查看与连接进来的 IP/端口匹配的ServerNameServerAlias指令,<VirtualHost>并匹配HTTP Host请求附带的标头。该匹配<VirtualHost>输出中的apachectl -S第一个将是接收请求的那个。
  • 如果未找到匹配项,则该 IP/端口的默认虚拟主机将接收请求。这是apachectl -S特定 ip/端口组合的输出中列出的第一个虚拟 hjost 。

请记住,IP可能只是*.