从301循环到完美解决方案

在使用 Cloudflare 作为 CDN 和 SSL 提供商时,很多开发者会遇到重定向循环的问题,特别是在配置 www 到非 www 重定向以及 HTTP 到 HTTPS 重定向时。本文将详细介绍如何正确配置 Cloudflare Flexible SSL 模式与 Nginx,实现完美的 HTTPS 重定向策略。

问题背景

我在配置域名重定向时遇到了一个典型问题:希望实现以下重定向逻辑:

  • `http://www.ropean.org` → `https://ropean.org` (301)
  • `http://ropean.org` → `https://ropean.org` (301)
  • `https://www.ropean.org` → `https://ropean.org` (301)
  • `https://ropean.org` → 正常显示内容 (200)

但实际访问 https://ropean.org 时却返回 301 重定向,形成了重定向循环。

问题分析

Cloudflare Flexible SSL 模式的工作原理

在 Flexible SSL 模式下:

  1. 用户到 Cloudflare:加密连接 (HTTPS)
  2. Cloudflare 到源服务器:非加密连接 (HTTP)

这意味着即使用户访问 https://ropean.org,到达 Nginx 服务器的请求仍然是 HTTP (端口80)。

初始错误配置

if ($server_port = 80) {
  rewrite ^(.*)$ https://ropean.org$uri permanent;
}
if ($host ~* ^www\.ropean\.org$){
  rewrite ^(.*)$ https://ropean.org$uri permanent;  
}

这个配置存在问题:

  • 当用户访问 `https://ropean.org` 时
  • Cloudflare 以 HTTP 转发到 Nginx (端口80)
  • 第一个 if 条件触发,产生 301 重定向
  • 形成重定向循环

完美解决方案

1. Cloudflare 设置

在 Cloudflare 面板中配置以下设置:

SSL/TLS 设置:

  • SSL/TLS 加密模式:**Flexible**
  • Always Use HTTPS:**开启**
  • Automatic HTTPS Rewrites:**开启**

2. 关键功能说明

Always Use HTTPS

  • 使用 301 重定向将所有 HTTP 请求重定向到 HTTPS
  • 作用于用户到 Cloudflare 层面
  • 与 Flexible SSL 不冲突

Automatic HTTPS Rewrites

  • 自动将页面内容中的 HTTP 链接重写为 HTTPS
  • 解决混合内容警告问题
  • 提升网站安全性和 SEO 表现

3. Nginx 配置

采用分离 server 块的方式,逻辑更清晰:

# 处理 www 子域名重定向
server {
    listen 80;
    server_name www.ropean.org;
    
    # www 域名总是重定向到 https://ropean.org
    return 301 https://ropean.org$request_uri;
}

# 处理主域名 server {     listen 80;     server_name ropean.org;          # 正常内容处理     # HTTP->HTTPS 重定向由 Cloudflare 的 Always Use HTTPS 处理     root /var/www/ropean.org;     index index.html index.php;          location / {         try_files $uri $uri/ =404;     }          # 如果使用 PHP     location ~ \.php$ {         fastcgi_pass unix:/var/run/php/php8.1-fmp.sock;         fastcgi_index index.php;         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;         include fastcgi_params;     } } `

完整的请求流程

1. http://www.ropean.org

用户请求 → Cloudflare Always Use HTTPS → https://www.ropean.org  
→ Cloudflare 转发 HTTP 到 Nginx → Nginx 重定向到 https://ropean.org
→ 最终:https://ropean.org (200)

2. http://ropean.org

用户请求 → Cloudflare Always Use HTTPS → https://ropean.org
→ Cloudflare 转发 HTTP 到 Nginx → 正常显示内容
→ 最终:https://ropean.org (200)

3. https://www.ropean.org

用户请求 → Cloudflare 转发 HTTP 到 Nginx → Nginx 重定向到 https://ropean.org  
→ 最终:https://ropean.org (200)

4. https://ropean.org

用户请求 → Cloudflare 转发 HTTP 到 Nginx → 正常显示内容
→ 最终:https://ropean.org (200)

配置部署步骤

1. 更新 Cloudflare 设置

  1. 登录 Cloudflare 控制面板
  2. 进入 SSL/TLS → Overview,确保模式为 **Flexible**
  3. 进入 SSL/TLS → Edge Certificates
  4. 开启 **Always Use HTTPS**
  5. 开启 **Automatic HTTPS Rewrites**

2. 更新 Nginx 配置

# 编辑配置文件
sudo nano /etc/nginx/sites-available/ropean.org

# 检查配置语法 sudo nginx -t

# 重载配置 sudo nginx -s reload `

3. 清除缓存

在 Cloudflare 面板中清除缓存,确保新配置立即生效。

测试验证

使用 curl 命令测试各种情况:

# 测试 HTTP 重定向
curl -I http://ropean.org
curl -I http://www.ropean.org

# 测试 HTTPS 重定向 curl -I https://www.ropean.org

# 测试最终目标 curl -I https://ropean.org `

预期结果:

  • 前三个命令应返回 `301 Moved Permanently`
  • 最后一个命令应返回 `200 OK`

方案优势

1. 性能优化

  • Cloudflare 边缘节点处理大部分重定向
  • 减少源服务器负载
  • 全球加速和缓存

2. 安全性

  • 完整的 HTTPS 加密(用户层面)
  • 自动处理混合内容问题
  • 防止中间人攻击

3. 成本效益

  • 使用 Cloudflare 免费 SSL 证书
  • 无需购买和维护 SSL 证书
  • 简化服务器配置

4. SEO 友好

  • 统一的 HTTPS URL 结构
  • 避免重复内容问题
  • 提升搜索引擎排名

常见问题解答

Q: Always Use HTTPS 和 SSL Flexible 会冲突吗?

A: 完全不冲突。Always Use HTTPS 作用于用户到 Cloudflare 层面,SSL Flexible 作用于 Cloudflare 到源服务器层面,它们在不同层级工作。

Q: 为什么不直接在服务器配置 SSL?

A: Flexible 模式适合以下场景:

  • 服务器配置简单,无需管理 SSL 证书
  • 利用 Cloudflare 的全球边缘节点优化性能
  • 免费获得高质量的 SSL 证书和安全服务

Q: 如何确认配置是否生效?

A: 可以通过以下方式验证:

  • 浏览器开发者工具查看网络请求
  • 使用在线 SSL 检测工具
  • curl 命令行测试各种 URL

总结

通过合理配置 Cloudflare 的 Always Use HTTPS 和 Automatic HTTPS Rewrites,配合简洁的 Nginx 重定向规则,我们可以实现:

  1. **完美的用户体验**:所有访问最终都指向 `https://ropean.org`
  2. **简洁的服务器配置**:Nginx 只需处理 www 重定向
  3. **高性能和安全性**:充分利用 Cloudflare 的边缘网络优势
  4. **经济实用**:免费获得企业级 SSL 服务

这个配置方案不仅解决了重定向循环问题,还提供了一个可扩展、高性能的 HTTPS 部署策略,适合大多数 Web 应用场景。