当我想将域/子域组合限制到特定端口时遇到了一个问题。
例如,当我只希望以下域/子域端口组合起作用时
https://domain.com:99001
https://subdomain.domain.com:99003
我发现它们不仅有效,而且下面的组合也有效,但我试图阻止它发生
https://domain.com:99003
https://subdomain.domain.com:99001
下面的脚本是我用来尝试实现该目标的
<VirtualHost *:99001>
#RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
ServerName www.domain.com
ServerAlias MYSERVER
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
<Location />
SSLRequireSSL
</Location>
ProxyPass / http://11.11.11.20:99011/
ProxyPassReverse / http://11.11.11.20:99011/
</VirtualHost>
<VirtualHost *:99003>
#RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
ServerName subdomain.domain.com
ServerAlias MYSERVER
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
<Location />
SSLRequireSSL
</Location>
ProxyPass / http://11.11.11.20:99013/
ProxyPassReverse / http://11.11.11.20:99013/
</VirtualHost>
我错过了什么?
答案1
对于基于名称的虚拟主机,Apache 使用指令ServerName
和 anyServerAlias
指令以及端口号来标识哪个虚拟主机应接收特定的传入请求。 在您的例子中,对备用端口的请求不得与任何虚拟主机匹配,换句话说,指令ServerName
和 anyServerAlias
指令在所有虚拟主机中必须是唯一的。
此外,使用ServerAlias
指令表明您正在使用能够保护多个域的安全证书。如果证书上的域在虚拟主机之间共享,则上述问题会变得更加严重,因为请求会继续进行,而不会向客户端发送安全证书错误。