跨域的解决方案

跨域的解决方案

  1. jsonp

        -> 十年前火爆前端的跨域解决方案
        -> 至今还在使用, 越来越少
        -> **和 ajax 没有关系**
    
  2. cors

        -> 五年前火爆前端的跨域解决方案
        -> 目前占市场份额大概 45%
        -> **和 前端 没有关系, 是后端来操作的**
        -> 将来工作的时候, 后端会告诉你我开启了 cors
    
    1. 代理(服务器代理)、
    -> 三年前火爆前端的跨域解决方案
    -> 目前占市场份额大概 50%
    -> 使用 nginx 服务器来代理发送请求
    

jsonp跨域

script 标签

      + 默认有一个 type 属性, 值是 text/javascript
      + 不管 src 请求什么文件, 都是把文件里面的所有内容都当作字符串读取出来
      + 把读取出来的字符串当作 js 代码来执行
    代码本身没有错, 错的是你把他放错了文件

src 属性

  + script 的 src 属性不受浏览器同源策略的影响
  + script 标签的 src 属性, 爱请求谁家的服务器请求谁家的服务器
  + 我们就可以使用 script 标签的 src 属性去请求一个别人家的服务器
  + 只要给我返回一个正确的 js 语法的代码, 那么就可以执行了

现在, 这个 script 标签请求的 php 文件

      + 返回的内容就是一个 'alert("你好 世界 php")'
      + script 标签会把这个字符串当作 js 代码来执行

不是把jsonp.php当js执行了嘛? 那为什么还能执行echo?

  + script 请求的是 jsonp.php 文件没错
  + script 请求时在 apache 服务器上发送的
  + apahce 服务器不管你怎么请求 php 文件
    => 只要他看到了 php 代码, 就会把他当作 php 给你先解析了

cors 跨域

    + 跨域是浏览器不让你请求别人家的服务器
    + 如果别人家的服务器告诉浏览器, 我允许这个域名请求我
      => 浏览器就管不着了, 就可以正常请求了

// 1.
var xhr = new XMLHttpRequest()

// 2.
xhr.open('GET', 'http://127.0.0.1/server/cors.php')

// 3.
xhr.onload = function () {
  console.log(xhr.responseText)
}

// 4.
xhr.send()

proxy => 代理

代理跨域(服务器正向代理跨域)、

    + 因为 **浏览器不允许** 你请求一个 **非同源** 的地址
    + 解决问题:
      => 在浏览器同源设置一个 代理服务器
      => 把本该发送给目标服务器的请求发送给 代理服务器
      => 由 代理服务器 转发请求给 目标服务器
      => 目标服务器把响应返回给 代理服务器
      => 代理服务器 在把响应给到 浏览器

怎么进行代理配置

    + 只要是服务器就能做代理
      => 但是 apache 代理
        -> http 的不需要花钱(以前的传输协议, 不加密传输)
        -> https 是需要花钱的(现在多用的传输协议, 加密传输)
      => nginx 代理
        -> http 和 https 都是免费的
    + 不在使用 apache 服务器了
      => 使用 nginx 服务器

  1. 打开 phpstudy 窗口
    => 点击切换版本
    => 点击 php5.4.xxx + nginx
  2. 打开 phpstudy 窗口
    => 点击其他选项菜单
    => 点击打开配置文件
    => 点击 nginx-conf(config)
      -> 大概在 56 行左右有一个 server
      -> 顺着开始括号找到 server 的闭合大括号
      -> 在这个闭合大括号的上面一行书写代理配置
    => 代理配置
      -> 我写了空格的地方你们也要写空格
      -> /gx 是你们自己定的, 些什么都可以, 这个就是代理标识符
        -> 斜线也是必须要有
      -> {} 里面的那个地址, 就是你要跨域请求的地址(目标服务器的地址)
        -> 最后的分号必须有
      location = /gx {
          proxy_pass http://127.0.0.1/server/proxy.php;
      }
      -> 修改完毕以后, 一定要重启服务器
    => 当你在 ningx 服务器上发送请求
      -> 只要请求你自己写的 代理标识符
      -> 那么就会由 nginx 服务器来帮你转发请求到 proxy_pass 地址

注意:

    + 当你切换到 nginx 服务器以后
    + 不管是 html 文件还是 php 文件, 都不能用中文了
      => 只要是中文就报错了

// 1.
var xhr = new XMLHttpRequest()

// 2./
//    请求的是代理标识符
//       nginx 会把我这个请求帮我代理到 http://127.0.0.1/server/proxy.php
xhr.open('GET', '/test')

// 3.
xhr.onload = function () {
  console.log(xhr.responseText)
}

// 4.
xhr.send()

中国加油!武汉加油!千峰加油!我自己加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值