Nginx跨域问题解析与解决

目录

什么是跨域

跨域场景

解决跨域的四种方式

什么是跨域

域: 是指浏览器不能执行其他网站的脚本

跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 跨域

跨域场景

场景的跨域场景有哪些,请参考下表

当前url请求url是否跨域原因
http://www.autofelix.cnhttp://www.autofelix.cn/api.php协议/域名/端口都相同
http://www.autofelix.cnhttps://www.autofelix.cn/api.php协议不同
http://www.autofelix.cnhttp://www.rabbit.cn主域名不同
http://www.autofelix.cnhttp://api.autofelix.cn子域名不同
http://www.autofelix.cn:80http://www.autofelix.cn:8080端口不同
解决跨域的四种方式

nginx的反向代理

使用 nginx 反向代理实现跨域,是最简单的跨域方式

只需要修改 nginx 的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能

// nginx配置 server { listen 81; server_name www.domain1.com; location / { proxy_pass http://www.domain2.com:8080; #反向代理 proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名 index index.html index.htm; # 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用 add_header Access-Control-Allow-Origin http://www.domain1.com; #当前端只跨域不带cookie时,可为* add_header Access-Control-Allow-Credentials true; } }

jsonp请求

jsonp 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好 兼容低版本IE,缺点是只支持 get 请求,不支持 post 请求

原理时网页通过添加一个 <script> 元素,向服务器请求 json 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来

//jquery实现 <script> $.getJSON('http://autofelix.com/api.php&callback=?', function(res) { // 处理获得的数据 console.log(res) }); </script>

后端语言代理

可以通过一种没有跨域限制的语言中转一下,通过后端语言去请求资源,然后再返回数据

比如 http://www.autofelix.cn 需要调用 http://api.autofelix.cn/userinfo 去获取用户数据,因为子域名不同,会有跨域限制

可以先请求 http://www.autofelix.cn 下的 php 文件,比如 http://www.autofelix.cn/api.php,然后再通过该 php 文件返回数据

// api.php 文件中的代码 public function getCurl($url, $timeout = 5) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $result = curl_exec($ch); curl_close($ch); return $result; } $result = getCurl('http://api.autofelix.cn/userinfo'); return $result;

后端语言的设置

主要通过后端语言主动设置跨域请求,这里以 php 作为案例

// 允许所有域名访问 header('Access-Control-Allow-Origin: *'); // 允许单个域名访问 header('Access-Control-Allow-Origin: https://autofelix.com'); // 允许多个自定义域名访问 static public $originarr = [ 'https://autofelix.com', 'https://baidu.com', 'https://csdn.net', ]; // 获取当前跨域域名 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array($origin, self::$originarr)) { // 允许 $originarr 数组内的 域名跨域访问 header('Access-Control-Allow-Origin:' . $origin); // 响应类型 header('Access-Control-Allow-Methods:POST,GET'); // 带 cookie 的跨域访问 header('Access-Control-Allow-Credentials: true'); // 响应头设置 header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token'); }

到此这篇关于Nginx跨域问题解析与解决的文章就介绍到这了,更多相关Nginx跨域内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    nginx开启日志

    nginx开启日志,日志,错误,vim /usr/local/nginx/conf/nginx.confuser nginx;worker_processes 2;error_log logs/error.log; (开启错误日

    Nginx 灰度发布(基于cookies)

    Nginx 灰度发布(基于cookies),灰度,用户,背景介绍 灰度发布,主要任务是从产品用户群中按照一定策略选取部分用户,让他们先行体验新功能或版本

    nginx 重启

    nginx 重启,重启,配置文件,平滑,定时重启,请求,中断,nginx重启对于网站的运维来说是非常重要的。根据不同的需求,可以选择简单重启、平滑重启或

    nginx 怎么读

    nginx 怎么读,服务,服务器,反向代理,并发,代理服务器,电子邮件,nginx 怎么读?nginx的官方正确读音是“恩静埃克斯”即“ Engine X”或者“en-juh

    nginx重启的办法

    nginx重启的办法,重启,配置,命令,更改,服务器,加载,nginx重启的方法:1、在Linux上重启Nginx,使用systemd来管理Nginx服务,它将重启Nginx并读取任何

    停止nginx服务的方法有哪些

    停止nginx服务的方法有哪些,服务,命令,方法,进程,杀死进程,有哪些,停止nginx服务有四种方法,如下:1、从容停止服务这种方法相对于温和一些,需要进

    linux怎么关闭nginx

    linux怎么关闭nginx,命令,进程,查看,方法,启动,杀死进程,linux关闭nginx的方法:1、利用“ps -ef | grep nginx”命令查看nginx进程后,利用“kill

    Nginx的服务器安全与企业内外防火墙

    Nginx的服务器安全与企业内外防火墙,服务器,防火墙,企业,安全性,监测,流量,Nginx是一款高性能的开源Web服务器软件,广泛用于企业项目中。Nginx的

    nginx启动、关闭、重启

    nginx启动、关闭、重启,进程,配置文件,nginx由一个master进程和若干worker进程组成,master进程主要用于读取配置文件和管理worker进程.work

    WIN10配置NGINX+PHP环境

    WIN10配置NGINX+PHP环境,注释,脚本,WIN10配置NGINX+PHP环境 版本 nginx-1.11.8 php-7.1.0-nts-Win32-VC14-x64 修改配置 修改php.in

    Nginx反向代理附件上传

    Nginx反向代理附件上传,上传,上传文件,前段时间公司测试同事说上传附件过大了就上传失败了,昨天一个人来加班,静下心来,慢慢的捋了一遍,大概过