我在网络服务器上看到了一些有趣的行为。
我使用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
答案 0 :(得分:1)
Apache分两个阶段解析虚拟主机。
首先,它找到最匹配的基于IP的vhost,只查看VirtualHost指令中的接口和端口。
如果有超过1个最佳匹配,当请求可用时,它会从基于IP的最佳匹配中选择最佳的基于名称的匹配。
每组基于名称的虚拟主机只有1个VH。
因此,一旦在连接级别选择了基于IP的vhost,就不会进行其他选择。它不会跳到另一组NVH'es。