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;}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不管对不对,先把闹钟关了再说

小榆提前关闭早上闹钟&#xff0c;几乎工作日的早晨都是被这魔怔的铃声给拉扯醒&#xff0c;无论有多么不愿还是痛苦&#xff0c;可对这闹钟也无可奈何&#xff0c;就算一时果断掐掉接下来是另一回麻烦事。最后一天&#xff0c;已经顾不得多少&#xff0c;没什么令人惧怕的人或…

pycharm(windows)安装及其设置中文菜单

pycharm&#xff08;windows&#xff09;安装及其设置中文菜单 1.下载 在官网&#xff08;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff09;进行下载 或者到百度云进行下载 专业版&#xff1a;链接&#xff1a;http://pan.baidu.com/s/1bSSRds 密码&…

Tomcat定义虚拟主机案例

Tomcat定义虚拟主机案例 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.准备环境 1>.创建web程序的根目录 [rootyinzhengjie ~]# mkdir -pv /home/yinzhengjie/data/www/webapps/ROOT mkdir: created direc…

node服务成长之路

我们的系统也从第一代平台开始到现在第四代平台更换中&#xff0c;对这四代平台做一个简单的介绍&#xff1a; 第一代平台&#xff0c;主要是集中式&#xff0c;以快速上线为目的&#xff1b;第二代平台主要是分布式改造&#xff0c;缓解各服务压力&#xff1b;第三代平台主要做…

将域名绑定到ip上,并实现访问不同二级子域名对应不同目录

一、将域名绑定到ip上1、环境介绍&#xff1a;阿里云服务器ESC&#xff08;美国硅谷&#xff09; 2、购买域名 3、备案 注&#xff1a;由于我买的是美国地区服务器&#xff0c;所以不用备案&#xff0c;如果买的国内服务器&#xff0c;这里需要添加一个备案操作。 4、域名实名认…

ABP vNext微服务架构详细教程(补充篇)——单层模板(中)

框架搭建2聚合服务这里我们将聚合服务命名为Domain.Core和基础服务层一致&#xff0c;我们先通过命令创建单层模板项目Domain.Core&#xff0c;这里我们删除wwwroot、Data、Entities、Localization、ObjectMapping文件夹及其所有子文件&#xff0c;并删除package.json文件和Ser…

谈一谈synchronized关键词

1.使用 java中的每一个对象都可以作为synchronized的锁进行代码同步&#xff0c;常见的形式 同步代码块锁是synchronized括号内的对象普通成员方法上&#xff0c;锁是当前的对象&#xff0c;synchronized(this)静态方法上&#xff0c;锁是当前类的Class对象2. 原理 synchronize…

系统学习redis之二——redis集群搭建

redis单点部署&#xff1a; 安装命令&#xff1a; # cd /usr/local/ # wget http://download.redis.io/releases/redis-4.0.1.tar.gz #下载安装包 # yum -y install gcc psmisc #安装依赖包 # tar xf redis-4.0.1.tar.gz # cd /usr/lo…

业务技术协同线上化的研发管理实战

摘要&#xff1a;2017年1月13日举办的【云栖计算之旅】线下沙龙第4期研发管理专场&#xff0c;阿里巴巴B2B事业群产品专家代平为大家带来了题为业务技术协同线上化的研发管理实战的演讲。本文主要从管理产品研发的理念开始谈起&#xff0c;着重说明了云效指挥部的六大步骤&…

Linux中写脚本,同时去开启我们自己设定的多个服务(含定时脚本实现)

场景介绍&#xff1a; 在Linux中&#xff0c;我们通常开启服务需要使用systemctl start 服务名 命令&#xff0c;这样&#xff0c;如果开启一个服务还好&#xff0c;但是如果同时开启多个服务&#xff0c;难免会感到麻烦&#xff0c;这时&#xff0c;我们可以自定义一个脚本&a…

Android之利用EventBus进行数据传递

在项目中&#xff0c;不可避免的要在两个页面之间进行数据的传递&#xff0c;就算不传递&#xff0c;也需要进行刷新之类的&#xff0c;我们根据Google提供的库类方法&#xff0c;也是可以做的&#xff0c;主要有广播broadcastreceiver&#xff0c;startactivity方法或者是appl…

负载均衡环境搭建实战之nginx和tomcat

Linux基本环境负载均衡的环境需要在linux下搭建完成&#xff0c;所以有一个基础的linux系统是必须的&#xff0c;这里建议大家按照http://edu.51cto.com/course/10209.html中的基础linux环境来安装&#xff0c;这样能少走弯路。JDK安装1、 下载对应版本的Java1.7&#xff0c;a)…

Java java.lang.SecurityException: Prohibited package name

java.lang.SecurityException: Prohibited package name 提示java错误&#xff1a; Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.xxx 问题所在&#xff1a;package java.xx; 定义包时不能以java.的形式定义转载于:https…

桌面应用如何判断win11操作系统

背景Windows 11 操作系统已经正式发布快有一年了&#xff0c;在 .Net 开发中&#xff0c;我们获取操作系统版本&#xff0c;经常使用 Environment.OSVersion.Version.Major 和 Minor&#xff08;6.1 Windows 7, 10.0 Windows 10&#xff09;&#xff0c;但是当 Win11 出现以后…

Nginx 网站定义自己的错误页面

场景&#xff1a; 为了给用户较好的交互和感官&#xff0c;我们通常需要对错误页面进行友好提示。 环境介绍&#xff1a; LNMP&#xff08;linux&#xff08;centos7.4&#xff09;Nginx Mysql5.6 php7.0&#xff09;实现&#xff1a; 这里&#xff0c;我直接对nginx的子配置文…

Python中的变量

1、声明变量&#xff1a; 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 namewupeiqi 上述代码声明了一个变量&#xff0c;变量名为&#xff1a;name&#xff0c;变量name的值为“wupeiqi” 变量的作用&#xff1a; 为了方便操作&#xff0c;需要把这些数据分别用一个简…

车辆调度

为什么80%的码农都做不了架构师&#xff1f;>>> 车辆调度系统 大体上分为4个部分吧 1.调度车辆&#xff1a;你调度的时候需要的车辆&#xff0c;方便给你运输啥的 2.调度任务&#xff1a;你为啥会调度车辆&#xff0c;肯定要有一个任务 3.客户&#xff1a;那这个…

threeJS 实用

texture可以是图片和canvas&#xff0c;并且最终是作为material的map属性来渲染。texture的构造函数中有一个参数image&#xff08;图片&#xff0c;canvas&#xff09;&#xff0c;使用图片的时候需要使用imageLoader加载到图片产生一个image对象&#xff0c;然后设置成为text…

C#爬虫-Selenium ChromeDriver 设置代理

背景开发爬虫程序&#xff0c;如果不做代理设置&#xff0c;本机的外网IP很容易被网站封掉&#xff0c;导致不能持续进行数据抓取。而Selenium作为动态网页抓取的利器&#xff0c;我们有必要了解一下&#xff0c;如何对它进行代理设置&#xff0c;并正常访问网页。解决办法1、首…

Nginx 设置,设置已经解析的域名,在nginx中没有定义相应server时的默认访问

场景介绍&#xff1a; 因为业务需求&#xff0c;我们需要对域名进行解析&#xff0c;这里我对域名进行了如下解析但是&#xff0c;因为业务需求&#xff0c;我可能在nginx中只定义了kuman.xiaobudiu.top 和 www.xiaobudiu.top 的相应server的子配置文件&#xff0c;如图那么问题…