项目背景:前端是uniapp开发的h5,后端是tp5,其他语言我觉得应该大同小异,主要是思路,本文就以这俩为例吧

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

这样就可以了,在tp5的方面就弄完了,没错,就是这么简单而且一般百度能搜索到的,就是这些

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

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中所有自定义的参数,都要写在第一步中的第三行里面,要不然就等着跨域吧~

OK,到这绝大部分到这也就没有问题了但是!鄙人就是这么的与众不同!没错,当我弄到这的时候!我又跨域了!想哭了

一开始我的开发环境是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不用配置这第三步

4、为啥还有第4步???

这第4步算是一个小提醒吧,就是tp程序不要报错。。。因为当tp5抛出异常的时候,会影响你public/index.php中的配置,导致产生跨域~

tip:不知道这篇文章还能不能回到首页,哈哈~~

thinkphp5 关于跨域的一些坑,附上解决办法(比较全面了)的更多相关文章

  1. IE8浏览器跨域接口访问异常的解决办法

    IE8版本以下浏览器绝对是一个神奇的存在,忙碌好久,万事具备,居然在ajax调用接口的时候直接爆炸 陈述一下问题 首先是有这样一个接口,请求类型POST,入参JSON,出参JSON,jQuery aj ...

  2. [PHP] 再续 Laravel 5.5 接口 跨域问题 【终极暴力解决办法】

    上文中提到 Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置 用插件来跨域 此方法能解决一部分api 请求问题 但我碰到的是 接口 请求size 超过10k,导致 ...

  3. jsonp跨域请求360数据乱码解决办法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

  5. Springboot中关于跨域问题的一种解决方法

    前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...

  6. 2019-03-26 SpringBoot项目部署遇到跨域问题,记录一下解决历程

    近期SpringBoot项目部署遇到跨域问题,记录一下解决历程. 要严格限制,允许哪些域名访问,在application.properties文件里添加配置,配置名可以自己起: cors.allowe ...

  7. [1.6W字]浏览器跨域请求的原理, 以及解决方法(可以纯前端实现) #flight.Archives011

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  8. 关于跨域踩的坑,浏览器 status code为200,但实际上是跨域了

    背景 后端使用Nginx并更改本地host文件,起本地服务.将aaa.bbbb.com代理至本地IP地址(10.26.36.156).使用$.ajax调用后端restful接口,要求content-t ...

  9. No 'Access-Control-Allow-Origin' header: 跨域问题踩坑记录

    前言 前两周在服务器上部署一个系统时,遇到了跨域问题,这也不是第一次遇到跨域问题了,本来以为解决起来会很顺利,没想到解决过程中遇到了很多坑,所以觉得有必要写一篇博客记录一下这个坑. 问题产生原因 本来 ...

  10. 解决No 'Access-Control-Allow-Origin' header is present on the requested resource.跨域问题(后台(java)解决方法)

    附:前端常见跨域解决方案(全) 跨域错误 解决方法 在后台写一个过滤器来改写请求头 附上一个前端不知所以然的后台java代码: public class CorsFilter implements F ...

随机推荐

  1. Android开发 活动activity

    一.关于Activity 关于Activity必须要了解的内容有:Activity的生命周期.android任务栈.Activity启动模式.scheme跳转协议. 1.1  什么是Activity ...

  2. Python正则表达式提取方法

  3. 15 JavaScript ES6中的箭头函数

    15 JavaScript ES6中的箭头函数 什么是箭头函数 ES6中允许使用=>来定义函数.箭头函数相当于匿名函数,并简化了函数定义. 基本语法 // 箭头函数 let fn = (name ...

  4. #插头dp#洛谷 5074 HDU 1693 Eat the Trees

    题目 给出 \(n*m\) 的方格,有些格子不能铺线, 其它格子必须铺,可以形成多个闭合回路. 问有多少种铺法? \(n,m\leq 12\) 分析 设 \(dp[n][m][S][0/1]\) 表示 ...

  5. #线性基#LOJ 114 k大异或和

    题目 分析 建出线性基后,但是要求最小所以要重建线性基让大的尽量小, 然后第k小就是拼凑 代码 #include <cstdio> #include <cctype> #inc ...

  6. AtCoder Beginner Contest 181

    ABC181 A - Heavy Rotation 题目传送门 代码(签到题) #include <cstdio> #define rr register using namespace ...

  7. kube-apiserver限流机制原理

    本文分享自华为云社区<kube-apiserver限流机制原理>,作者:可以交个朋友. 背景 apiserver是kubernetes中最重要的组件,一旦遇到恶意刷接口或请求量超过承载范围 ...

  8. OpenHarmony中的HDF单链表及其迭代器

    概念 为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构.单链表是链表中的一种,本文描述OpenAtom OpenHarmo ...

  9. C# 面向对象编程进阶:构造函数详解与访问修饰符应用

    C# 构造函数 构造函数是一种特殊的方法,用于初始化对象.构造函数的优势在于,在创建类的对象时调用它.它可以用于为字段设置初始值: 示例 获取您自己的 C# 服务器 创建一个构造函数: // 创建一个 ...

  10. C/C++ 项目构建指南:如何使用 Makefile 提高开发效率

    Makefile是一个常用的自动化构建工具,它可以为开发人员提供方便的项目构建方式.在C/C++项目中,Makefile可以用来编译.链接和生成可执行文件.使用Makefile的好处是可以自动执行一系 ...