跨域原理:http://www.cnblogs.com/Alear/p/8758331.html

介绍Ngnix之前,我么先来介绍下代理是什么~

  代理相当于中间人,中介的概念

  代理分为正向代理和反向代理。(PS:本文介绍的解决跨域方法用的是反向代理)

    正向代理:现在客户端发送一个请求给服务端,可是该客户端没有访问权限,于是只能交给一个代理服务器来转交该客户端的请求给服务端响应。

         客户端知道请求资源地址,也能感知代理服务器的存在。

    反向代理:客户端发送一个请求,代理服务器收到这个请求,判断到这个请求对应的服务器并不能响应。于是代理服务器自行转发到可以响应该请求的服务器,并将响应内容返回给客户端。

         客户端并不知道实际上是哪个服务器响应的内容 。

Ngnix是什么:

  Nginx (engine x) 是一个高性能的HTTP反向代理服务器。

安装Ngnix和基本配置介绍可以看下这篇~ :

Linux下: https://blog.csdn.net/yougoule/article/details/78186138

Window下:;https://www.cnblogs.com/saysmy/p/6609796.html

(PS)如果在window命令行操作出现下面这种情况

改成:  .\nginx -s start    (‘ngnix’ 换成 ‘ .\ngnix’)

接下来不废话了,我们来点实际的招式,直接上栗子,敲黑板!!!

我现在有一个项目是在 "localhost:80/test(等于localhost/test)下的"

可是我有个ajax请求是向localhost:8080/echarts/map请求的

如果直接请求浏览器的控制台会直接被报错

一般出现这种错误是跨域引起的

那么我们可以在ngnix配置文件nginx.conf(在ngnix安装目录下的conf文件下)这样配置来实现反向代理

 nginx.conf

  1. server {
  2. listen 8081;
  3. server_name localhost;
  4.  
  5. #charset koi8-r;
  6. #access_log logs/host.access.log main;
  7. root "D:/phpStudy/WWW";
  8.  
  9. location /echarts/map {
  10. #rewrite localhost:8080/echarts/map break;
  11. if ($request_method = 'OPTIONS') {
  12. add_header Access-Control-Allow-Origin http://localhost;
  13. add_header Access-Control-Allow-Credentials true;
  14. add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
  15. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  16. return 200;
  17. }
  18. if ($request_method = 'POST') {
  19. add_header 'Access-Control-Allow-Origin' http://localhost;
  20. add_header 'Access-Control-Allow-Credentials' 'true';
  21. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  22. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  23. }
  24. proxy_pass http://localhost:8080/echarts/map;
  25. }
  26. location /test/{
  27. if ($request_method = 'OPTIONS') {
  28. add_header Access-Control-Allow-Origin http://localhost;
  29. add_header Access-Control-Allow-Credentials true;
  30. add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
  31. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  32. return 200;
  33. }
  34.  
  35. if ($request_method = 'POST') {
  36. add_header 'Access-Control-Allow-Origin' *;
  37. add_header 'Access-Control-Allow-Credentials' 'true';
  38. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  39. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  40. }
  41.  
  42. if ($request_method = 'GET') {
  43. add_header 'Access-Control-Allow-Origin' *;
  44. add_header 'Access-Control-Allow-Credentials' 'true';
  45. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  46. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
  47. }
  48. proxy_pass http://localhost:80;
  49. #rewrite ^/localhost:80/941bigdata/
  50. }

于是我们的站点访问地址应该改为 ”localhost:8081/test

那个ajax外源请求地址应该改为”http://localhost:8081/echarts/map

然后就能成功进行跨域访问啦~

我们的http请求

补充:

  我们会发现上面有不止配置了POST请求,还配置了OPTION请求。如果没有配置OPTION,则http报文里的请求方式是option,并报403错误

  那是因为做跨域的时候,浏览器会自动发起一个 OPTIONS 方法到服务器。

  当contentType设置为三个常用的格式以外的格式,如“application/json”时,会先发送一个试探的OPTIONS类型的’预请求‘给服务端,用于探测后续真正需要发起的跨域 POST 请求对于服务器来说是否是安全可接受的,

  因为跨域提交数据对于服务器来说可能存在很大的安全问题。

我们在进行请求访问时候,多看看http报文的内容,可以帮助我们很快找到问题关键所在。像我在解决跨域问题时,http报文给了我很大思路。

这是Ngnix反向代理请求解决跨域的方式。后面我会出一篇后端(springMVC)通过CORS解决跨域的方案.

版权声明:本文为博主原创文章,未经博主允许不得转载哟

[跨域]跨域解决方法之Ngnix反向代理的更多相关文章

  1. json跨域原理及解决方法

    这一篇文章呢,主要是之前一直听别人讲json跨域跨域,但是还是一头雾水,只知其一,于是一怒之下,翻阅各种资料,如果有不正确的地方,劳烦指正一下^_^ 首先,先了解浏览器有一个很重要安全性限制,即为同源 ...

  2. jQuery ajax跨域请求的解决方法

    在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...

  3. jquery ajax跨域的完美解决方法(jsonp方式)

    ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码     今天在项目中需要做远程数据加载 ...

  4. AJAX及其跨域的主要解决方法

    AJAX = Asynchronous JavaScript andXML(异步的 JavaScript 和 XML).通过在后台与服务器进行少量数据交换,使网页实现异步更新.要明白异步交互可以通过同 ...

  5. Vue 项目中遇到的跨域问题及解决方法

    原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...

  6. 跨域问题及其解决方法(JSONP&CORS)

    一.什么是跨域 当a.qq.com域名下的页⾯或脚本试图去请求b.qq.com域名下的资源时,就是典型的跨域行为.跨域的定义从受限范围可以分为两种,⼴义跨域和狭义跨域. (一)广义跨域 ⼴义跨域通常包 ...

  7. chrome 阻止跨域操作的解决方法 --disable-web-security

    做chrome插件时,遇到https页面上请求htttp页面资源时被blocked的问题,初苦寻解决方法未果,最后找到: 给chrome加上 --disable-web-security 参数

  8. WebLogic12.1.1中跨域问题的探讨以及几种常见中间件中跨域问题的解决方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.问题描述 扬州现场中最开始安装了中间件WebLogic12.1.1 ...

  9. Ngnix反向代理react-router配置问题解决方法

    项目以react router实现,用ngnix做反向代理的时候出现404找不到页面,有两种解决方法. 第一种  将<Route path="*" component={No ...

随机推荐

  1. Verilog MIPS32 CPU(二)-- Regfiles

    Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...

  2. ORA-01722: 无效数字的解决方法

    Select Count(t.Wip_No) As Consignvendnewcreateno_Num From   Apps.View_Scm_Wip_Po t Where  1 = 1 And  ...

  3. Ajax 如何执行 Response.Redirect

    Ajax 直接对服务端的Response.Redirect是不感冒的, 另觅途径, 具体可行办法如下: Web Service 服务端: public WXService() { if (!IsVal ...

  4. [Perl][文件操作]判断文件是否为符号链接(Unicode路径)

    Win32API::File 判断文件/文件夹是否为符号链接 Win32::Unicode 好像无法做这方面的判断,只能判断是否为目录.文件.文件是否存在. Win32API::File 则支持 Ge ...

  5. system idle process

    偶然发现windows环境任务管理其中存在进程 system idle process,cpu占用极大但内存占用很小.google了一下,保存下结果 system idle process :系统空闲 ...

  6. Charles弱网测试

    当前APP网络环境比较复杂,网络制式有2G.3G.4G网络,还有越来越多的公共Wi-Fi.不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响.另外,当前app使用场景多变,如进地铁.上公 ...

  7. Template 动画

    如果设置Template的动画,也就意味着对每一个具有此Template的对象进行动画处理. 比如对ListBoxI的ItemTemplate进行设置,添加动画,触发器等,每一个ListBoxItem ...

  8. GPU大百科全书 第一章:美女 方程与几何

    沉鱼落雁   前言:当你酣战在星际2的时候,或者当你在艾泽拉斯游历的时候,你有没有想过,眼前的这些绚丽的画面究竟是怎么来的呢?也许对大多数人来说,GPU对于图形的处理过程并不是那么重要,但总会有些人, ...

  9. 对Java意义重大的7个性能指标

      本文中,小编搜集了7个最有影响的衡量标注,让你可以不依赖日志文件来了解应用程序现在,让我们看看这些性能指标,并了解如何查看并收集它们.: 一,响应时间和吞吐量 根据应用程序的响应时间可以知道程序完 ...

  10. iOS开发中UILocalNotification本地通知实现简单的提醒功能

    这段时间项目要求做一个类似的闹钟提醒功能,对通知不太熟悉的我,决定先用到xcode自带的本地通知试试,最终成功的实现了功能,特整理分享下. 它的表现特点: app关闭的时候也能接收和显示通知. app ...