Nginx- 实现跨域访问
一、什么是跨域
跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容。详细见下表:
注:同源策略,单说来就是同协议,同域名,同端口
URL | 说明 | 是否允许通信 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js |
同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js |
同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js |
同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js |
同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://70.32.92.74/b.js |
域名和域名对应ip | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js |
主域相同,子域不同 | 不允许 |
http://www.a.com/a.js http://a.com/b.js |
同一域名,不同二级域名(同上) | 不允许(cookie这种情况下也不允许访问) |
http://www.cnblogs.com/a.js http://www.a.com/b.js |
不同域名 | 不允许 |
二、为什么要跨域
出于安全考虑(比如csrf攻击),浏览器一般会禁止进行跨域访问,但是因为有时有相应需求,需要允许跨域访问,这时,我们就需要将跨域访问限制打开。
比如:Ajax请求另一个域名获取数据
当前网站www.kk.com 请求另一网站接口 www.oo.com/getuser/uid/220305, 获取user数据
三、跨域的实现
1、前后端结合(JsonP)
虽然jsonp也可以实现跨域,但是因为jsonp不支持post请求,应用场景受到很大限制,所以这里不对jsonp作介绍。
了解jsonp实现跨域可以点击这里:
https://blog.csdn.net/u014607184/article/details/52027879/
2、纯后端方式一(CORS方式)
CORS 是w3c标准的方式,通过在web服务器端设置:响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4,firefox3.5,safair4,opera12支持这种方式。
服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。
这种方式直接在响应php文件中设置header即可
示例代码:
<?php
header('Access-Control-Allow-Origin:http://www.kk.com');
$data = array('name'=>'m_nanle_xiaobudiu','age'=>26,'sex'=>'man'
);
echo json_encode($data);
当我们需要允许多个域名跨域访问时,可以这样做
<?php
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';$allow_origin = array('http://www.kk.com','http://www.gg.com'
);if(in_array($origin, $allow_origin)){header('Access-Control-Allow-Origin:'.$origin);
}
$data = array('name'=>'m_nanle_xiaobudiu','age'=>26,'sex'=>'man'
);
echo json_encode($data);
3、纯后端方式二(Nginx代理方式)【建议这种方式】
直接在nginx服务器上设置模块参数。
—— 代码实现:
html部分(www.kk.com):
<html lang="en">
<head><meta charset="UTF-8" /><title>测试ajax和跨域访问</title><script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">$(document).ready(function(){$.ajax({type: "post",url: "http://www.oo.com/1.php",success: function(data) {alert(data);},error: function() {alert("fail!!!,请刷新再试!");}});});
</script>
<body>
<h1>测试跨域访问</h1>
</body>
</html>
php部分(www.oo.com):
<?php
$data = array('name'=>'m_nanle_xiaobudiu','age'=>26,'sex'=>'man'
);
echo json_encode($data);
Nginx配置文件部分、
server {listen 80;server_name www.oo.com ;root "G:\oo";add_header Access-Control-Allow-Origin http://www.kk.com;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;location / {index index.html index.htm index.php;#autoindex on;}location ~ \.php(.*)$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include fastcgi_params;}}
注:实际项目中,可能我们提供的接口需要允许不止一个域名访问,这时,我们需要配置允许多个域名访问,这时,我们可以用map
示例:
map $http_origin $corsHost {default 0;"~http://www.kk.com" http://www.kk.com;"~http://www.gg.com" http://www.gg.com;
}
server {listen 80;server_name www.oo.com ;root "G:\oo";add_header Access-Control-Allow-Origin $corsHost;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;location / {index index.html index.htm index.php;#autoindex on;}location ~ \.php(.*)$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include fastcgi_params;}
}
Nginx- 实现跨域访问相关推荐
- nginx实现跨域访问(案例cookie实现跨域,)多方案实现
案例cookie实现跨域 (我的博客里有更新) 跨域,顾名思义,个人理解就是:任意两个url只要协议.域名.端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题. 方案一(前端需要实现跨域) ...
- Nginx配置跨域访问
由于浏览器同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问 ...
- nginx实现跨域访问
跨域概念 简单来说:两个url只要协议.域名.端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题. 案例 例如:在开发前后端完全分离的系统中,服务端代码属于一个工程,前端代码属于另一个工程 ...
- fastdfs nginx 文件跨域访问
搭好fastdfs以后,正常访问浏览器没问题,但是前端获取的时候会出现跨越访问.因为访问fastdfs的图片的时候是用Nginx访问的,nginx当中要配置跨域访问,前端才能正常获取图片. 一定要在l ...
- nginx配置跨域访问后不生效,仍然显示跨域问题
解决方案 首先,我们先确定跨域源目标没写错,可以先将Allow-Origin改成*测试 server {listen 80;server_name https://www.test.com;locat ...
- nginx php 跨域访问权限,nginx + php 实现跨域请求填坑笔记
最近自己构建了一个轻量级的 MVC 框架,现在将该MVC用于生产环境的项目中,目前因为项目中有跨域的请求,所以需要做一些CORS授权,但在实际使用出现了一些问题,目前已解决,故做下记录. 服务器:ce ...
- linux apache 跨域,解决nginx/apache静态资源跨域访问问题详解
1. apache静态资源跨域访问 找到apache配置文件httpd.conf 找到这行 #LoadModule headers_module modules/mod_headers.so 把#注释 ...
- apache ajax 跨域访问,AJAX跨域访问(从Tomcat8到Apache/Nginx)
1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 crossdomain.x ...
- nginx设置图片跨域访问
生而为人 谁不付出 谁不努力 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log ...
- nginx跨域访问设置
1.ngxin跨域访问错误提示 Access to fetch at 'http://ip:端口/' from origin 'http://域名' has been blocked by CORS ...
最新文章
- LeetCode(15):三数之和
- 如何将本地项目上传至GitHub
- how is object structure really created - when the child equipment is downloaded
- scope参数错误或没有scope权限_SSM 单体框架 - 前端开发:用户和权限模块
- 判断浏览器 插件 jquery.ua.js
- 学python心得体会800字-Python初学心得体会
- apt update时出现签名无法验证,公钥失效的解决办法
- linux centos需要MPEG-4 AAC解码器
- java学习视频 java常用23种设计模式
- JavaScript中使鼠标光标变为图片
- Java爬坑--集合(二)List
- 转录组测序(质控、比对、计数)
- 教你分割视频,几分钟快速分割多个视频
- 科研——谷歌学术使用方法
- wms仓库管理系统带来的效益
- [杂言] 祭奠与真正的告别
- 5、隐私计算--同态加密
- C++学习(四八二)zlib的inflate
- 阿里短信服务 JAVA
- 赔1100万美元!谷歌招聘年龄歧视
热门文章
- 给IT新人的15个建议:苦逼程序员的辛酸反省与总结
- OCFS2在Linux下配置文档
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
- VForum 2008系列之六:分论坛视频-虚拟世界中的应用
- ABP vNext微服务架构详细教程——分布式权限框架(上)
- 教你10分钟对接人大金仓EF Core 6.x
- Docker小白到实战之Docker网络简单了解一下
- EF Core 6 简化的数据库上下文注册
- C# params的用法详解
- 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...