Ubuntu 16.04 Apache2安装Let's Encrypt后重定向过多如何解决?
咱们先定位问题根源:这种重定向循环大概率是Let's Encrypt自动生成的SSL配置和你的.htaccess规则发生了冲突,或是HTTP/HTTPS、www/非www的重定向规则被重复定义了。下面一步步排查解决:
第一步:检查Apache的SSL配置文件(apache2-le-ssl.conf)
先打开这个自动生成的配置文件,看看里面有没有内置的重定向规则:
sudo nano /etc/apache2/sites-available/apache2-le-ssl.conf
重点找有没有类似这样的强制HTTPS重定向代码:
RewriteEngine on
RewriteCond %{SERVER_NAME} =yourdomain.com [OR]
RewriteCond %{SERVER_NAME} =www.yourdomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
如果这里已经有了HTTPS强制跳转,那你的.htaccess里就不能再重复加相同规则,否则会触发循环。
第二步:检查两个.htaccess文件的重定向规则
分别打开app/.htaccess和app/webroot/.htaccess,查找有没有重复的重定向代码,比如:
# 强制HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 强制www/非www跳转 RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
要是Apache配置里已经有了HTTPS跳转,.htaccess里又重复添加,就会导致来回跳转的死循环。
第三步:统一重定向规则,消除冲突
根据你的需求,选一种方式统一配置,不要两边都加:
方式1:用Apache配置文件管理重定向(推荐)
如果apache2-le-ssl.conf里已经有了HTTPS重定向,直接把两个.htaccess里的HTTPS跳转规则删掉。如果需要统一www/非www域名,也在Apache配置里添加,比如强制跳转到www:
在apache2-le-ssl.conf的<VirtualHost *:443>代码块里加入:
# 强制跳转到www域名 RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com$ [NC] RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [L,R=301]
添加后重启Apache生效:
sudo systemctl restart apache2
方式2:用.htaccess管理重定向
如果想让.htaccess控制所有重定向,先把apache2-le-ssl.conf里的HTTPS重定向规则注释掉(在行首加#),然后在app/webroot/.htaccess里添加统一规则(只在一个.htaccess里加,不要两个都配置):
RewriteEngine On # 先强制跳转HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 再统一域名(示例:非www转www) RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
同样重启Apache让规则生效。
第四步:验证重定向是否正常
用浏览器访问你的域名(记得先清理浏览器缓存,因为301重定向会被缓存),或者用curl命令测试:
curl -I http://yourdomain.com
正常情况应该返回301 Moved Permanently,并跳转到你设置的目标域名(比如https://www.yourdomain.com),且不会出现多次跳转的提示。
额外注意:如果两个.htaccess里一个强制www、一个强制非www,也会触发循环,要确保所有重定向规则的目标一致。
内容的提问来源于stack exchange,提问作者Abhishek Sohu

