我在一台服务器上托管两个网站。每个都定义了自己的 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)
解决方案:
清除浏览器缓存。我的浏览器缓存了一个规则来将请求转发到另一个站点。
难道不是在你的端口定义:混合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 版本的最基本测试:
<VirtualHost>
该 IP/端口的单个匹配标记,则该虚拟主机将接收请求ServerName
和ServerAlias
指令,<VirtualHost>
并匹配HTTP Host
请求附带的标头。该匹配<VirtualHost>
输出中的apachectl -S
第一个将是接收请求的那个。apachectl -S
特定 ip/端口组合的输出中列出的第一个虚拟 hjost 。请记住,IP可能只是*
.