zoukankan      html  css  js  c++  java
  • thinkphp5 关于跨域的一些坑

    1、首先在tp5的入口文件:public/index.php 在里面添加三行:

    // [ 应用入口文件 ]
     
    header("Access-Control-Allow-Origin:*");
    header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE");
    header("Access-Control-Allow-Headers:x-requested-with, Referer,content-type,token,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding");
    // 不用多说,就是上面三行,注意第三行,里面有一个参数:token,这个是为后面自定义header头准备的<br>
    // 定义应用目录
    define(‘APP_PATH‘, __DIR__ . ‘/../application/‘);
    // 加载框架引导文件
    require __DIR__ . ‘/../thinkphp/start.php‘;

    一般情况下这样也就行了,但是有的时候还会存在跨域,原因就是前端请求的时候有一个地方需要注意

    2、前端uniapp的网络请求用的是uni.request,不管是uni.request还是jq的ajax,都一样,都需要注意一点,就是请求类型不能是application/json!!

    uni.request({
      url: ‘http://test-tp5.io‘,
      data: {a:1,b:2},
      header: {
        ‘content-type‘: ‘application/x-www-form-urlencoded‘, // 用这个!
        // ‘content-type‘: ‘application/json‘, 这里是反面举例,一定不要用这个!不信你试试!
        ‘token‘: ‘this is token‘  // 看到这个token了没有,它在在第一步的第三行出现过~
      },
      method: ‘POST‘,
      success: (res)=> {
        console.log(‘成功了:‘,res);
      },
      fail: (res)=>{
        console.log(‘出错了:‘,res);
      }
    });
    

      header中所有自定义的参数,都要写在第一步中的第三行里面,要不然就等着跨域吧~

    一开始我的开发环境是phpstudy,在到这一步的时候,跨域问题已经消失的无影无踪了,然后前几天我换成了docker,然后久违的跨越又来了。。。

    而且跨域的原因是自定义header参数,即如果我把request里面的token参数去掉,请求是正常的,加上就不行了!

    此时经过对比我发现,phpstudy我用的是apache,docker我用的是nginx,而且当我把项目迁到phpstudy的时候就没有跨域问题,此时问题原因显而易见!

    3、经过搜索、测试,现得出在nginx下如何配置跨域的自定义header参数

    在站点配置文件中 location / {} 里面添加下面几行:

    location / {
        if ($request_method = ‘OPTIONS‘) {
                # 【必须】建议在发布环境用域名而不是“星”号
                add_header Access-Control-Allow-Origin ‘*‘;
                # Allow-Headers 指定允许的自定义请求头,如用户 Token,而且这些不用写那么多,只写自定义的参数就可以
                add_header Access-Control-Allow-Headers ‘token‘;
                # 一般来说在 POST 请求时因为 Content-Type 的原因在本次 OPTIONS 预请求后,
                # 会再发送的 POST 请求,而 POST 请求是可以正常接收的
                # add_header Access-Control-Allow-Methods ‘GET, POST, PUT, DELETE, PATCH, OPTIONS‘;
                # 请求是否携带 Cookie,无需要可忽略。有说该设置为 true 时 Allow-Origin 不可为 ‘*‘
                # add_header Access-Control-Allow-Credentials true;
                # 这个响应 Content-Type 也是根据需要设置(一般情况可以不用设置)
                # add_header Content-Type ‘application/json; charset=utf-8‘;
                # 如下 Content-Length 可忽略,返回状态码根据个人习惯可设置为 200
                add_header Content-Length 0;
                return 204;
            }
         # 没错,为了方便你们对比,上面这些才是要添加的
         # 而且你们可能发现了,我上面有好多注释掉的,因为这些是我在搜索出来的,而且经过我一步步的注释,发现只要一开始的两行和最下面的两行就可以了
     
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
    }
    

      至此才是真正的解决了跨域的问题,可能是apache默认配置了的原因,apache不用配置这第三步

  • 相关阅读:
    无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。
    jQuery导航菜单防刷新
    IE6下Png透明最佳解决方案(推荐) Unit PNG Fix
    每周进步要点(第50周12.4-12.11)
    学习笔记:重塑你的自我驱动力
    学习笔记之是什么决定我们的命运
    读书《万万没想到 3》
    人与人之间的鄙视链是如何形成的?
    第7本《万万没想到-用理工科思维理解世界2》
    中明写公众号的时候他在想什么
  • 原文地址:https://www.cnblogs.com/flzs/p/15246236.html
Copyright © 2011-2022 走看看