Nginx跨域问题解析与解决

Nginx跨域问题解析与解决

什么是跨域问题

在同源策略(Same-Origin Policy)的限制下,浏览器禁止通过javascript访问不同源的接口(协议、域名、端口任一个不同都会被认为是不同的源),这就是跨域问题。

Nginx解决跨域问题

Nginx是一种高性能的Web服务器,不仅可以用作Web服务器,还可以用作反向代理、负载均衡、缓存服务器、HTTP服务器等。

Nginx通过配置HTTP头来解决跨域问题。我们可以在Nginx服务器端设置Access-Control-Allow-Origin头,允许指定的域名访问接口。以下是具体步骤:

  1. 在nginx.conf配置文件中新增下面的内容:
location / {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
}
  1. 这里的Access-Control-Allow-Origin'*'表示允许所有跨域请求访问,如果你只想允许指定的域名访问,可以将此处修改为对应的域名,如:Access-Control-Allow-Origin 'http://www.domain.com'。

  2. 如果开启了set_by_lua_directive指令,则需要在该指令中加入以下内容,保证Nginx正常运行

location / {
    # Set by Lua
    Set $cors 'false';
    access_by_lua_block {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
            if ($http_origin ~* (http?:\/\/(localhost|domain.com(:\d+)?$))) {
                set $cors 'true';
            }
            if ($cors = 'true') {
                return 204;
            }
            return 403;
        }
    }
}

示例说明

示例1

假设我们拥有一个Nginx服务器,提供了一个接口http://example.com/api/getData,现在希望其他网站也可以通过ajax访问这个接口。

首先,我们在nginx.conf配置文件中新增以下内容:

location /api {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
    proxy_pass http://127.0.0.1:8080;
}

这里我们新增了一个location /api的配置,允许外部网站访问,接口的请求地址变为http://example.com/api/getData。

示例2

假设我们还拥有一个前端项目,需要访问其他网站的接口。由于跨域问题的限制,不能直接访问。我们可以通过以下步骤解决跨域问题:

  1. 在前端项目的nginx.conf配置文件中新增以下内容:
location /api {
    add_header 'Access-Control-Allow-Origin' 'http://www.domain.com';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    proxy_pass http://remote-domain.com;
}

这里我们新增了一个location /api的配置,指定允许http://www.domain.com访问,接口的请求地址变为 http://example.com/api/getData。

  1. 然后,在前端项目中通过ajax访问这个接口就可以了。
$.ajax({
    url: '/api/getData',
    type: 'GET',
    dataType: 'json',
    crossDomain: true,
    xhrFields: {
        withCredentials: true
    },
    success: function (data) {
        // 数据获取成功后的处理
    },
    error: function () {
        // 数据获取失败后的处理
    }
});

这里我们指定了跨域请求类型(crossDomain: true),设置了带凭证请求(xhrFields: {withCredentials: true}),即可访问位于http://remote-domain.com上的接口。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nginx跨域问题解析与解决 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • nginx –反向代理配置文件

    配置文件如下图   server { listen 8080; server_name 0.0.0.0;//这里可以配置相应域名 root /www/facei; index index.html index.htm; access_log /var/log/nginx/facei.access.log; error_log /var/log/nginx/f…

    Nginx 2023年4月12日
    00
  • Nginx高效原因

    1 设计原理   一个高性能服务器典型特点是处理速度块且占用资源少.尤其是当上万连接同时 在线时候.若要做到处理速度快,并发模型设计尤其关键.   服务器并发量取决于两个因素:一是服务器连接的进程数量,二是每个进程可同时处理的并发请求数量,因而服务器并发模型由两部分构成,服务的提供 方式和链接处理机制, 由于这两种别具一格的方式使得Nginx在同类型的网页服…

    Nginx 2023年4月11日
    00
  • nginx.conf—-location匹配规则

    指令作用:     匹配指定的请求URI 语法:   location [=|~|~*|^~|@] /uri/ {configuration} 匹配命令:   ~  表示执行一个正则匹配,区分大小写   ~*  表示执行一个正则匹配,不区分大小写   ^~     表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其他。一般用来匹配目录   =     …

    Nginx 2023年4月16日
    00
  • nginx反向代理后abp的webapi host如何获取客户端ip?

    dotnet core 跨平台是微软伟大的创举,脱离iis后服务器成本都降低了。 问题 这不,采用abp搞了个小项目,部署到centos后发现审计日志里面的ip信息不对。 解决 这个问题在.net 4.5下处理过,记得当时是继承 WebClientInfoProvider重写GetClientIpAddress。将代码拿来后发现dotnet core下报错。…

    Nginx 2023年4月16日
    00
  • Mac 使用 brew 安装 nginx 配置 php

    Mac 使用 brew 安装 nginx 配置 php 一.安装 查找 brew search nginx 可用版本使用 brew install nginx 安装nginx 二.安装完成后brew会输出关于nginx的配置信息 根目录 #Docroot is: /usr/local/var/www 配置文件和启动端口 #The default port h…

    Nginx 2023年4月12日
    00
  • 如何正确配置Nginx + PHP

    下面就是详细讲解如何正确配置Nginx + PHP的完整攻略。 1. 安装Nginx和PHP 首先需要安装Nginx和PHP。可以使用以下命令: sudo apt-get update sudo apt-get install nginx sudo apt-get install php-fpm php-mysql 2. 配置Nginx 在配置Nginx之前…

    Nginx 2023年5月16日
    00
  • Nginx的安装及简单配置

    Nginx安装 1.下载相关组件 yum install -y gcc gcc-c++                                   #安装C/C++编译器 yum -y install gd-devel geoip-devel perl-ExtUtils-Embed wget http://125.39.35.133/files/40…

    Nginx 2023年4月16日
    00
  • k8s笔记——NodePort暴露nginx-controller实现https自动跳转自定义nodePort端口

    安装nginx-controller并暴露nodePort helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx/ helm repo update helm install gateway ingress-nginx/ingress-nginx –set contro…

    Nginx 2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部