Apache 2.2 VirtualHosts和多个端口

时间:2014-02-11 21:56:54

标签: apache

我在网络服务器上看到了一些有趣的行为。

我使用VirtuaHosts指令设置了一些https网址,并将它们放在非标准端口上。我正在使用端口4443和4543.

因此,浏览https://test-domain.com:4443有效,https://test2-domain.com:4543也是如此。但是,如果我输入test-domain2.com:4443或test-domain.com:4445,它也会通过端口将您带到正确的网页。 (当我正在测试我正在输入完整链接时,堆栈溢出不会让我输入两个以上,所以我删除了问题的https://部分)。

基本上,只要您传递一个有效的域,就可以放入任一端口,它会将您带到该端口上托管的站点。我认为这种行为是不可能的。我想如果我用站点的B端口输入站点A的域名,我会找回一个未找到的页面或另一个错误页面,而是我总是被带到站点B.它会解析到端口上托管的任何内容。

如果有人有任何建议或知道我做错了什么,我会很感激答案或帮助。

这是Apache配置... 我确实查看了在线apache文档,并尝试使用NameVirtualHost和VirtualHost的Web服务器IP地址进行实验,并产生相同的行为

NameVirtualHost *:4443

<VirtualHost *:4443>
#SetEnv VHOST "test.domain.com"
ServerName test.domain.com
DocumentRoot /var/www/test/public
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile ssl/test.domain.com.crt
SSLCertificateKeyFile ssl/test.domain.com.key
SSLCertificateChainFile ssl/gd_bundle.crt
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

ErrorLog logs/test-error_log
CustomLog logs/test-access_log common
</VirtualHost>


NameVirtualHost *:4543

<VirtualHost *:4543>
#SetEnv VHOST "test2.domain.com"
ServerName test2.domain.com
DocumentRoot /var/www/test2/public
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile ssl/test2.domain.com.crt
SSLCertificateKeyFile ssl/test2.domain.com.key
SSLCertificateChainFile ssl/gd_bundle.crt
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

ErrorLog logs/test2-error_log
CustomLog logs/test2-access_log common
</VirtualHost>

跟进,我尝试添加以下部分:          重定向404 /     ErrorDocument 404“没有这样的网站。检查网址拼写。我们的主要网站是\                   http://test1.domain.com/'>http:/test1.domain.com”     

<VirtualHost *:4543>
Redirect 404 /
ErrorDocument 404 "No Such Site.  Check the URL spelling.  Our main site is \
              <a href='http://test2.domain.com/'>http://test2.domain.com"
</VirtualHost>

和apachectl -S显示以下内容:

*:4543                 is a NameVirtualHost
default server test2.domain.com (/etc/httpd/conf.d/test.https.conf:76)
port 4543 namevhost test2.domain.com (/etc/httpd/conf.d/test.https.conf:76)
port 4543 namevhost ip-10-0-1-204.ec2.internal (/etc/httpd/conf.d/test.https.conf:92)
*:4443                 is a NameVirtualHost
default server test1.domain.com (/etc/httpd/conf.d/test.https.conf:51)
port 4443 namevhost test1.domain.com (/etc/httpd/conf.d/test.https.conf:51)
port 4443 namevhost ip-10-0-1-204.ec2.internal (/etc/httpd/conf.d/test.https.conf:68)
*:443                  is a NameVirtualHost
default server test.domain.com (/etc/httpd/conf.d/test.https.conf:20)
port 443 namevhost test.domain.com /etc/httpd/conf.d/test.https.conf:20)
port 443 namevhost ip-10-0-1-204.ec2.internal (/etc/httpd/conf.d/ssl.conf:76)
*:80                    is a NameVirtualHost
default server test.domain.com (/etc/httpd/conf.d/test.http.conf:3)
port 80 namevhost test.domain.com (/etc/httpd/conf.d/test.http.conf:3)
port 80 namevhost test1.domain.com (/etc/httpd/conf.d/test.http.conf:8)
port 80 namevhost test2.domain.com (/etc/httpd/conf.d/test.http.conf:13)
port 80 namevhost ip-10-0-1-204.ec2.internal (/etc/httpd/conf.d/test.http.conf:18)
    wild alias *.domain.com

1 个答案:

答案 0 :(得分:1)

Apache分两个阶段解析虚拟主机。

首先,它找到最匹配的基于IP的vhost,只查看VirtualHost指令中的接口和端口。

如果有超过1个最佳匹配,当请求可用时,它会从基于IP的最佳匹配中选择最佳的基于名称的匹配。

每组基于名称的虚拟主机只有1个VH。

因此,一旦在连接级别选择了基于IP的vhost,就不会进行其他选择。它不会跳到另一组NVH'es。