nginx解决ajax前端跨域问题(多个跨域)

本文介绍如何通过配置Nginx服务器解决前端ajax调用跨域问题,详细展示了Nginx配置文件的修改过程,包括添加跨域请求头、设置代理服务器等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近项目中遇到了一个问题,要在前端用ajax调用另一个平台的服务展示数据,但是服务不支持跨域。于是,就想用nginx解决下,网上的方案很多,下载了nginx最新版,修改默认的配置文件。。。如下


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8083;
        server_name  localhost;
        add_header Access-Control-Allow-Origin *;  # 允许跨域
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		location /devices/ {
		    add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' '*';
            add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
		    proxy_pass http://api.heclouds.com;
		}
    }

}

       设置端口号8083,测试地址在本地设为localhost,/devices/为ajaxurl中要匹配的关键字,http://api.heclouds.com实际要访问的地址。

       很自信,没有问题,在本地运行程序测试。。。

尼玛。。。还是报错,但是在浏览器直接访问nginx地址是可以跨域访问的,原来系统的运行地址localhost:13217和nginx访问地址localhost:8083也是跨域的

在nginx配置文件中要增加系统运行地址的跨域配置,其中/xxxxx/为系统运行地址中匹配的关键字,http//localhost:13217 为系统运行实际地址


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8083;
        server_name  localhost;
        add_header Access-Control-Allow-Origin *;  # 允许跨域
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
        #onenet
		location /devices/ {
		    add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' '*';
            add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
		    proxy_pass http://api.heclouds.com;
		}
		location /xxxxx/ {
		    add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' '*';
            add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
		    proxy_pass http://localhost:13217;
		}

    }

}

系统访问的入口为nginx的地址localhost:8083/xxxxx/

<think>嗯,用户现在在问关于Nginx代理解决问题,特别是配置中的IP和端口是否需要与前端一致才能解决。我需要先回顾一下问题的根本原因。是浏览器出于安全考虑实施的同源策略,限制了不同源之间的资源交互。同源指的是协议、名、端口都相同。 用户之前的问题是关于后端接口的400错误,现在转向了Nginx配置,可能是在部署过程中遇到了问题,或者想了解如何正确配置Nginx来处理。需要明确Nginx作为反向代理的作用,它如何帮助解决。 首先,Nginx解决的原理是通过将前端和后端的请求统一到同一个下。因为是浏览器的限制,服务器之间通信没有这个问题。所以当用户的前端请求发送到Nginx,再由Nginx转发到后端服务时,浏览器看到的是同一个源,就不会触发限制。 接下来需要解释Nginx的配置。关键的配置点包括设置Access-Control-Allow-Origin等CORS头,以及可能的代理设置。用户的问题提到是否IP和端口需要与前端一致。其实,只要前端请求的是Nginx的地址和端口,而Nginx代理到后端服务,这样前端Nginx同源,就不存在了。因此,Nginx的监听端口需要是前端访问的端口,而IP通常是服务器的IP,前端通过这个IP和端口访问,Nginx再转发到后端不同的端口或IP。 可能需要详细说明配置示例,例如在Nginx的配置文件中添加location块,处理前端请求并代理到后端,同时设置CORS头。另外,要强调add_header指令的正确使用,避免被Nginx的默认配置覆盖,可能需要使用always参数。 用户可能存在的误区是认为Nginx和后端必须在同一IP和端口,但实际上关键在于前端请求的是Nginx的地址,而后端服务可以通过Nginx代理到不同的地址。因此,Nginx的IP和端口需要与前端的请求一致,但后端服务可以运行在其他地方。 还需要提醒用户关于CORS头的其他配置,如允许的方法、头部、凭据等,根据实际需求调整。另外,如果存在OPTIONS预检请求,需要正确配置处理,返回204状态码。 总结来说,回答需要分步骤解释Nginx如何通过反向代理解决,配置关键点,以及IP和端口的关系,纠正可能的误解,并提供配置示例和注意事项。</think>以下是关于Nginx解决问题的技术解析,采用分步式说明: --- ### 一、问题本质 浏览器出于安全考虑实施的**同源策略**限制,当出现以下任意一项不同时即产生: - 协议(http/https) - 名(www.a.com 与 api.a.com) - 端口(80 与 8080) --- ### 二、Nginx解决的核心原理 **通过反向代理统一请求源**: 1. 前端访问 `https://your-domain.com`(由Nginx托管) 2. Nginx将 `/api/` 路径的请求代理到真实后端服务(如 `http://backend-service:8080`) 3. 浏览器认为所有请求来自同一源(your-domain.com),不再触发限制 --- ### 三、Nginx配置关键(无需IP/端口完全一致) #### 1. 基础代理配置 ```nginx server { listen 80; server_name your-domain.com; # 前端访问的名/IP # 前端静态资源 location / { root /usr/share/nginx/html; index index.html; } # 代理API请求 location /api/ { proxy_pass http://backend-service:8080/; # 后端真实地址(可IP/端口) # 关键CORS头设置 add_header 'Access-Control-Allow-Origin' $http_origin always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type,Authorization' always; add_header 'Access-Control-Allow-Credentials' 'true' always; # 处理OPTIONS预检请求 if ($request_method = 'OPTIONS') { return 204; } } } ``` #### 2. 配置参数说明 | 配置项 | 作用说明 | |-------------------------------|------------------------------------------------------------------------| | `proxy_pass` | 将请求转发到实际后端服务(**无需与前端同IP/端口**) | | `Access-Control-Allow-Origin` | 允许的源(`$http_origin`动态获取请求源,生产环境建议固定白名单) | | `always`参数 | 确保Nginx在任何响应状态码下都返回CORS头(避免4xx/5xx响应丢失头) | --- ### 四、验证要点 1. **前端访问地址**必须与Nginx的`server_name`和`listen`端口一致 - 例:前端通过`http://your-domain.com`访问 → Nginx需监听80端口 2. **后端服务地址**可通过代理指向任意可达的IP/端口 - 代理目标可以是:其他服务器、Docker容器、本地不同端口服务等 --- ### 五、常见误区纠正 - **误区**:必须让Nginx和后端服务使用相同IP/端口 - **事实**:只需保证**前端请求的目标地址**(Nginx暴露的地址)与前端自身**同源**即可 ```mermaid graph LR A[前端] -->|请求 https://your-domain.com/api/| B(Nginx 80端口) B -->|代理到| C[后端服务 8080端口] ``` --- ### 六、进阶实践建议 1. **生产环境安全配置**: ```nginx # 限制允许的源 map $http_origin $cors_origin { default ""; "https://your-domain.com" "https://your-domain.com"; "https://sub.your-domain.com" "https://sub.your-domain.com"; } add_header 'Access-Control-Allow-Origin' $cors_origin always; ``` 2. **性能优化**: 对`OPTIONS`预检请求添加缓存头 ```nginx add_header 'Access-Control-Max-Age' 1728000; # 20天缓存 ``` 通过以上配置,即可实现安全可靠的解决方案,无需关注前后端服务的具体部署位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值