我的设置:
site1.com |端口 80
site2.com |端口 80
panel.site1.com |将端口 80 流量重写为 443
这一直有效,直到有人尝试 https://站点[x].com并且服务器将他们重定向到我的面板。我需要这个面板对~100个使用它的人开放,但我不希望错误的人偶然发现它。
我尝试添加:
<VirtualHost *:443>
ServerAdmin me@email
ServerName site1.com
ServerAlias www.site1.com
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
到 site1.com 的 vhost,但它仍然返回控制面板。我相信这是因为在应用 Apache 虚拟主机规则之前会检查证书,但我不太确定。是否有解决此问题的方法,或者仅仅是Apache2 + SSL的限制?
Apache 文档指出了这一点。
如果在 包含最具体的匹配 IP 地址的虚拟主机和 端口组合,然后是第一个列出的与之匹配的虚拟主机 将被使用。
因此,看起来您已将panel.site1.com
的<VirtualHost>
部分保留在所有其他虚拟主机部分之上。因此,对https://site[x].com
的请求将落在其中,因此该问题与SSL
无关。
更新:
您可以尝试以下配置,它应该可以工作。
<VirtualHost *:80>
ServerName www.site1.com
ServerAlias site1.com
DocumentRoot /var/www/site1
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^panel.site1.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</VirtualHost>
<VirtualHost *:80>
ServerName www.site2.com
ServerAlias site2.com
DocumentRoot /var/www/site2
</VirtualHost>
<VirtualHost *:443>
ServerName panel.site1.com
DocumentRoot /var/www/panel
SSLEngine on
SSLOptions +StrictRequire
SSLCertificateFile /opt/apache1/conf/server.crt
SSLCertificateKeyFile /opt/apache1/conf/server.key
</VirtualHost>
这是如何工作的
- 当请求是
http://site1.com
第一个VirtualHost
部分将被选中。 - 当请求
http://site2.com
时,将选择第二个VirtualHost
部分。 - 如果请求到达
http://site[x].com
则首先VirtualHost
部分将被选中。 - 如果请求到达
http://panel.site1.com
则请求将被重定向到https://panel.site1.com
并选择第三个VirtualHost
部分。