配置Nginx正向代理避免301重定向以解决CORS问题
Nginx CORS代理配置解决方案
问题根源
- 目标站点(比如google.com)大多强制HTTP跳转HTTPS,你当前配置用
http://$1发起请求,直接触发目标站点的301重定向 - 未正确传递目标站点的Host头,导致Cloudflare等防护站点验证失败
- 重定向后客户端直接跳转至目标站点,完全绕开了代理,CORS限制自然无法解决
修正后的完整配置
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name proxy.example.com; # 拆分请求路径中的目标域名和后续路径 location ~ ^/(?<target_host>[^/]+)(?<target_path>/.*)?$ { # 全局允许跨域 add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Headers *; # 快速处理CORS预检请求 if ($request_method = OPTIONS) { return 204; } # DNS解析配置,添加缓存提升效率 resolver 8.8.8.8 valid=300s; resolver_timeout 5s; # 传递正确的Host头,适配Cloudflare等防护机制 proxy_set_header Host $target_host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # 禁用自动重定向跟随,替换响应中的目标域名避免客户端跳转 proxy_redirect off; proxy_redirect ~^https?://$target_host/(.*) /$target_host/$1; # 拼接完整的HTTPS目标URL发起代理请求 proxy_pass https://$target_host$target_path$is_args$args; } }
关键修改说明
- 改用HTTPS请求目标站点:直接用
https://发起代理请求,从根源避免HTTP→HTTPS的301重定向 - 路径正则拆分:通过正则捕获独立的目标域名和后续路径,避免请求路径混乱
- Host头正确传递:让目标站点识别到真实的访问域名,解决Cloudflare等站点的验证拦截问题
- 重定向拦截替换:把响应中目标站点的跳转链接替换成代理域名的链接,确保客户端始终走代理访问
- 预检请求处理:针对CORS的OPTIONS请求直接返回204,避免预检失败导致的跨域报错
额外注意事项
- 确保你的Nginx已默认包含
ngx_http_proxy_module(绝大多数安装包都自带) - 部分有严格反爬或防盗链的站点可能会拦截代理请求,测试时尽量选择公开无限制的站点
- 若目标站点有特殊的请求头要求,可自行添加对应的
proxy_set_header配置
内容的提问来源于stack exchange,提问作者rschristian
相关产品推荐
相关产品推荐

