nginx代理-解决CORS跨域问题: Access to XMLHttpRequest at XXX from XXX

全文目录,一步到位

  • 1.前言简介
  • [2. nignx角度解决方案](#2. nignx角度解决方案)
    • [2.1 分析问题原因](#2.1 分析问题原因)
      • [2.1.1 翻译一波](#2.1.1 翻译一波)
      • [2.1.2 分析及解决方案](#2.1.2 分析及解决方案)
    • [2.2 nginx配置如下](#2.2 nginx配置如下)
      • [2.2.1 增加一个代理配置](#2.2.1 增加一个代理配置)
      • [2.2.2 使用方式](#2.2.2 使用方式)
    • [2.3 问题解决](#2.3 问题解决)
      • [2.3.1 改完不生效](#2.3.1 改完不生效)
  • [3. 其他解决方案](#3. 其他解决方案)

1.前言简介

先看报错信息:

Access to XMLHttpRequest at 'https://apis.map.qq.com/ws/geocoder/v1/?address=***\&key=***\&get_poi=\*' from origin 'https://域名' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

2. nignx角度解决方案

2.1 分析问题原因

场景: 前端自己请求地图, 没有通过后端服务

所以只能在nginx代理中去添加配置

2.1.1 翻译一波

https://***源访问https://apis.map.qq.com/ws/geocoder/v1/的XMLHttpRequest已被CORS策略阻止:在被请求的资源上没有Access- control - allow - origin头。

2.1.2 分析及解决方案

分析

腾讯地图的api 报跨域,

  • 后端需要通过服务器代理
  • 设置请求头在转发到 腾讯地图地址

解决方案:

经过多次测试, 选定一个方案

创建一个路径 起名/map/v1/ (特别注意最后面的 /)

修改nginx配置conf

添加 此路径location

2.2 nginx配置如下

2.2.1 增加一个代理配置

位置如下

示例代码:
bash 复制代码
  location /map/v/ {  
    
        # 路径重写
        rewrite /map/v/(.*)$ /$1 break;
        proxy_pass https://apis.map.qq.com;  
         # proxy_pass https://www.baidu.com/;  
        
         #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;  
  
        # 添加CORS响应头部  
        add_header 'Access-Control-Allow-Origin' '*';  
        add_header 'Access-Control-Allow-Methods' '*';  
        add_header 'Access-Control-Allow-Headers' '*';  
        add_header 'Access-Control-Max-Age' 1728000;  
  
        # 对于预检请求(OPTIONS),直接返回200  
        if ($request_method = OPTIONS) {  
            return 204;  
        }  
    }  

2.2.2 使用方式

原来请求: https://apis.map.qq.com/ws/geocoder/v1/...

现在请求: https://你的域名/map/v/...

2.3 问题解决

2.3.1 改完不生效

  1. 重启nginx服务
  2. 清除浏览器缓存/更换浏览器
  3. 可以使用postman/apipost尝试
  4. 如果nginx是docker部署的 可以去看看容器内配置是否与本地挂载目录配置相同
  5. 确认一下位置是否正确

3. 其他解决方案

前端解决

或者后端服务远程调用 服务内配置跨域(不推荐)


作者pingzhuyan 感谢观看

相关推荐
Lsetea11 分钟前
Nginx报SSL_CTX_use_PrivateKey failed:证书与私钥不匹配怎么排查
nginx·https·ssl证书·openssl·私钥
运维行者_23 分钟前
ISP 企业级带宽计费怎么做?网络流量计费的 6 大核心能力
运维·服务器·网络·数据库·支持向量机·接口隔离原则
数安旭说37 分钟前
企业终端行为审计建设:本地审计 + 网络审计构建完整溯源取证体系
运维·数据安全·软件需求·溯源·审计·网络审计
嘻哈baby1 小时前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
慧都小项1 小时前
MyEclipse 2026:当 Agent、MCP 与 Java 26 进入 Eclipse 工作流
java·eclipse·springboot·copilot·myeclipse
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 中回填时间序列数据:通过批量 API 加载数月的历史指标数据
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
10mAh2 小时前
【Linux】CPU 100% 怎么排查?——top、pidstat、jstack 到线程定位实战
linux·运维·服务器
CoderYanger2 小时前
前端基础——JavaScript(基础语法)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
京师20万禁军教头2 小时前
39面向对象(高级)-设计模式
java·开发语言·设计模式
!chen2 小时前
客户环境 Nginx 配置流式报表与超时排查
运维·nginx