编辑:我从两个无效的域的VirtualHosts中取出了重定向行。重新启动Apache后,两个站点的HTTP和HTTPS版本均按预期工作,但不再(显然)自动重定向。但是那些完全相同的重定向规则对于sidmandesign.com来说也可以正常工作
我正在使用Ubuntu将Web服务器从IIS服务器迁移到LAMP堆栈。我使用certbot为我的三个域安装了三个SSL证书。 Certbot在虚拟主机目录中添加了-le-ssl.conf文件,因此我现在在那里(全部位于/ etc / apache2 / sites-enabled /目录中,并且在apache.conf中包含适当的包含内容):
sidmandesign.conf:
<VirtualHost *:80>
ServerName www.sidmandesign.com
ServerAlias sidmandesign.com
DocumentRoot "/var/www/html/Sidman Designs/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =sidmandesign.com [OR]
RewriteCond %{SERVER_NAME} =www.sidmandesign.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
sidmandesign-le-ssl.conf:
<VirtualHost *:443>
ServerName www.sidmandesign.com
ServerAlias sidmandesign.com
DocumentRoot "/var/www/html/Sidman Designs"
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/sidmandesign.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sidmandesign.com/privkey.pem
</VirtualHost>
augustinebuilders.conf:
<VirtualHost *:80>
ServerName www.augustinebuilders.com
ServerAlias augustinebuilders.com
DocumentRoot "/var/www/html/augustine/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =augustinebuilders.com [OR]
RewriteCond %{SERVER_NAME} =www.augustinebuilders.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
augustinebuilders-le-ssl.conf:
<VirtualHost *:443>
ServerName www.augustinebuilders.com
ServerAlias augustinebuilders.com
DocumentRoot "/var/www/html/augustine"
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/augustinebuilders.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/augustinebuilders.com/privkey.pem
</VirtualHost>
salvagedserendipity.conf:
<VirtualHost *:80>
ServerName www.salvagedserendipity.com
ServerAlias salvagedserendipity.com
DocumentRoot "/var/www/html/salvagedserendipity/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =salvagedserendipity.com [OR]
RewriteCond %{SERVER_NAME} =www.salvagedserendipity.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
salvagedserendipity-le-ssl.conf:
<VirtualHost *:443>
ServerName www.salvagedserendipity.com
ServerAlias salvagedserendipity.com
DocumentRoot "/var/www/html/salvagedserendipity"
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/salvagedserendipity.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/salvagedserendipity.com/privkey.pem
</VirtualHost>
Sidmandesign.com可以正常工作,它可以重定向到HTTPS,我可以看到所有内容。但是,当我尝试另外两个站点时,它们重定向到HTTPS,但是在Chrome中却收到了ERR_TOO_MANY_REDIRECTS,通用站点无法在Edge / IE中显示此页面。
有什么想法为什么一个域可以工作,而当配置看起来相同时另一个域却不能工作?
答案 0 :(得分:0)
您的RewriteCond
语法
在您的*:80 VirtualHost中,删除RedirectCond
和RewriteRule
伪指令并添加(好,根据您的域进行调整!):
Redirect permanent / https://www.example.com
无需验证域名是否匹配,Apache只会在域匹配ServerName
或ServerAlias
指令值的情况下使用该VirtualHost中的配置。
另一点,RewriteCond
不需要=
符号(以备将来参考):
RewriteCond %{SERVER_NAME} ^www.example.com$
在VirtualHost *:80中删除DocumentRoot
由于您从不为*:80 VirtualHost提供任何内容,因此应删除DocumentRoot
指令。
多个SSL虚拟主机问题
对于端口80,可以定义许多VirtualHosts没问题。 Apache将查看请求的域并使用匹配的配置。
但是对于SSL,这不起作用。在使用浏览器完成SSL证书协商之后,Apache才能读取请求的域。那怎么办呢?它使用找到的第一个*:443 VirtualHost。
解决方法是:
1 SSL域== 1 IP == 1仅为该IP设置了VirtualHost(即不是*:443)。这里的问题是您可能无法访问多个地址。
1个SSL域== 1端口==为该端口设置了1个VirtualHost(即*:443,*:444,...)。这里的问题在于,端口443是https站点的默认端口,因此需要在浏览器中显式请求其他站点,这对于客户端来说是非常直观的。如果您的Apache前面有网络基础结构,则可以在那里更改端口。 https://www.example.com
发送到apache:443
,https://www.example2.com
发送到apache:444
,依此类推。但这需要在流量到达Apache之前
在Apache(https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI)中使用SNI。
您的情况
http://<SOMEDOMAIN>
发送到适当的VirtualHost。https://<SOMEDOMAIN>
。应该。/etc/letsencrypt/live/sidmandesign.com/fullchain.pem
是发送到客户端浏览器的证书。您可以通过查看浏览器控制台并检查证书来对此进行验证。最后
对于“ Chrome中的ERR_TOO_MANY_REDIRECTS” ,请查看控制台(F12,“网络”标签,选中“保留日志”)。您将看到Chrome获得的每个重定向。这样,您将看到正在循环的内容。我的猜测是'='符号弄乱了事情。