我在一台服务器上有多个站点和一个 SSL 证书。
问题是我需要将所有网站从 重定向https
到http
除了一个网站之外,这个网站应该是唯一使用 的网站https
。https-subsite.mainsite.ru
例如。
此网站上有一些链接,在搜索不应使用的网站时出现https
,例如https://https-subsite.mainsite.ru?eee=11&sd=1
和https://other-non-https.mainsite.ru
),但这些链接没有任何结果。
我认为它们遵循端口 443,该端口的 DocumentRoot 为 443 /var/www/blah/data/www/https-subsite.mainsite.ru
- 它的 DocumentRoot 仅适用于应使用 https 的一个站点。(请参阅下面的配置。)
我尝试手动将单个站点从 https 重定向到 http,如下所示:
<VirtualHost *:443 >
ServerName other-non-https.mainsite.ru
ServerAlias *.other-non-https.mainsite.ru
Redirect 301 / other-non-https.mainsite.ru
</VirtualHost>
并且它工作正常,所以一切https://other-non-https.mainsite.ru
都http://other-non-https.mainsite.ru
正常。我可以将其复制到其他网站,但这似乎不是一个好主意。
有没有其他更好的方法将非 https 站点重定向到其 http 地址?(例如使用单一规则,而不是每个站点使用不同的虚拟主机。)
我的httpd.conf:
<Directory /var/www/blah/data/www/mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/https-subsite.mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/other-non-https.mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/othernonhttps.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
NameVirtualHost *:80
NameVirtualHost *:443
#first site with https
<VirtualHost *:443 >
SSLCertificateChainFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.bundle
SSLCertificateFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.crt
SSLCertificateKeyFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.key
SSLEngine on
ServerName https-subsite.mainsite.ru
CustomLog /var/www/httpd-logs/https-subsite.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/https-subsite.mainsite.ru
ErrorLog /var/www/httpd-logs/https-subsite.mainsite.ru.error.log
ServerAdmin [email protected]
ServerAlias www.https-subsite.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php
php_admin_value open_basedir "/var/www/blah/data:.:/usr/share/pear:/usr/share/php"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName https-subsite.mainsite.ru
CustomLog /var/www/httpd-logs/https-subsite.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/https-subsite.mainsite.ru
ErrorLog /var/www/httpd-logs/https-subsite.mainsite.ru.error.log
ServerAdmin [email protected]
ServerAlias www.https-subsite.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php
php_admin_value open_basedir "/var/www/blah/data:.:/usr/share/pear:/usr/share/php"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName mainsite.ru
CustomLog /var/www/httpd-logs/mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/mainsite.ru
ErrorLog /var/www/httpd-logs/mainsite.ru.error.log
ServerAdmin [email protected]
ServerAlias www.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [email protected]"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName othernonhttps.ru
CustomLog /var/www/httpd-logs/othernonhttps.ru.access.log combined
DocumentRoot /var/www/blah/data/www/othernonhttps.ru
ErrorLog /var/www/httpd-logs/othernonhttps.ru.error.log
ServerAdmin [email protected]
ServerAlias www.othernonhttps.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [email protected]"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName other-non-https.mainsite.ru
CustomLog /var/www/httpd-logs/other-non-https.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/other-non-https.mainsite.ru
ErrorLog /var/www/httpd-logs/other-non-https.mainsite.ru.error.log
ServerAdmin [email protected]
ServerAlias www.other-non-https.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [email protected]"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
答案1
我们在上面的评论主题中兜圈子,所以让我以答案的形式为你清楚地说明这一点:一旦用户在浏览器中输入了 HTTPS URL,他们就必须与具有与他们输入的主机名匹配的正确签名证书的服务器进行 HTTPS 交易否则,他们无法执行任何其他操作。任何出错的情况(端口 443 上没有侦听器、证书中的主机名错误、证书过期或自签名)都会为用户生成错误。这些错误在首次建立 HTTPS 连接时出现,远早于服务器可以传回任何重定向指令。有否则 HTTPS 就毫无意义了。
您没有明确说明这一点,但我假设您只有一个 IP 地址。最适合您的情况是 SNI,并结合每个托管主机的有效、公开签名证书。 低于这个标准将会给你的用户带来问题,你唯一的选择是哪个它将会产生什么问题。
如果您不介意用户必须点击自签名证书警告,那么除了具有公开有效证书的主机之外,所有主机都使用 SNI 和自签名证书可能是您最好的选择。
如果以上都不可接受,请更清楚地说明你的用户愿意容忍哪些错误最后,请允许我再重复一遍:如果你不准备为所有虚拟站点获取公开签名的证书、支持 SNI 并要求用户支持 SNI,那么你就无法做到这一点,否则你的用户就会遇到某种错误。