Azure CDN环境下非www域名重定向出现循环问题求助
问题分析与解决方案
出现301 Too many redirects循环的核心原因是:Azure CDN Classic默认回源时使用的是源服务器的主机头,而非用户请求的实际主机名,导致NGINX无法正确区分example.com和www.example.com的回源请求,触发重复重定向。以下是几种可行的解决方法:
方案一:在CDN层面配置重定向(推荐)
直接在Azure CDN规则引擎中设置重定向规则,无需回源到NGINX,避免循环且更高效:
- 登录Azure门户,进入你的Microsoft CDN Classic配置文件
- 打开规则引擎页面
- 添加新规则:
- 匹配条件:选择「主机名」,运算符「等于」,值填写
example.com - 动作:选择「URL重定向」
- 重定向类型:选择301(永久重定向)
- 目标协议:HTTPS
- 目标主机名:
www.example.com - 目标路径:保留原始路径(使用
{URL}变量)
- 匹配条件:选择「主机名」,运算符「等于」,值填写
- 保存规则,等待15-60分钟让CDN配置生效
方案二:修正CDN回源主机头设置
调整CDN回源时的主机头,让NGINX能正确识别www.example.com的请求:
- 登录Azure门户,找到你的CDN端点
- 进入「配置」选项卡
- 在「源主机头」处选择「自定义」,输入
www.example.com - 保存配置,等待生效
同时确保NGINX有正确处理www.example.com的server块:
server { listen 8080; listen [::]:8080; server_name www.example.com; location / { # 这里填写你的业务逻辑,比如反向代理到后端应用 proxy_pass http://your-backend-service; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
方案三:调整NGINX配置识别CDN回源请求
通过CDN发送的X-Forwarded-Host头部判断原始请求主机名,避免错误重定向:
server { listen 8080; listen [::]:8080; server_name example.com; # 针对CDN回源的请求,通过X-Forwarded-Host判断原始主机名 if ($http_x_forwarded_host = example.com) { return 301 https://www.example.com$request_uri; } # 处理直接访问example.com的非CDN请求 return 301 https://www.example.com$request_uri; }
内容的提问来源于stack exchange,提问作者Philipp Elhaus
相关产品推荐
相关产品推荐

