更多内容,请访问我的 个人博客。


前言

难以置信,我居然被跨域问题折磨了一上午。相信很多程序员都遇到过跨域问题,当然,解决方案也有很多种。但我今天尝试了无数种办法,依旧没有解决。直到最后我媳妇儿给了我个提示,会不会跨域问题只是表象,真正的bug在其他地方。后来,经过我仔细排查,终于发现原来是PhalApi框架中的一个小问题,引发了跨域报错(文末再说PhalApi框架中的问题是啥)。那我也借这个机会,来和大伙聊聊啥是跨域问题,和有哪些常见的解决方案。

什么是跨域

什么是快乐星球,呸,什么是跨域呢?

简单来讲,跨域是指从一个域名的网页去请求另一个域名的资源。比如从百度(baidu.com)页面去请求我的博客(blog.pangao.vip)的资源。但由于有同源策略的关系,一般是不允许这么直接访问的。

什么是同源策略

一言蔽之,同源就是协议、域名和端口都相同。

URL1 URL2 说明 是否同源
http://blog.pangao.vip/a.js http://blog.pangao.vip/123/b.js 协议、域名、端口均相同 同源
http://blog.pangao.vip/a.js https://blog.pangao.vip/b.js 协议不同,域名和端口相同 非同源
http://blog.pangao.vip/a.js http://pangao.vip/b.js 域名不同,协议和端口相同 非同源
http://blog.pangao.vip:80/a.js http://blog.pangao.vip:8080/b.js 端口不同,域名和协议和相同 非同源

为什么要有同源策略

试想,如果你刚刚在网银输入账号密码,查看了自己还有1万块钱,紧接着访问一些不规矩的网站,这个网站可以访问刚刚的网银站点,并且获取账号密码,那后果可想而知。所以,从安全的角度来讲,同源策略是有利于保护网站信息的。

为什么要跨域

然而,有一些情况下,我们是需要跨域访问的。比如,程序员开发网站,就有可能需要在本地访问服务器的数据。再比如某公司的A页面(a.pangao.vip)有可能需要获取B页面(b.pangao.vip)。

跨域问题的4种解决方案

1、浏览器插件

谷歌浏览器有一款允许跨域的插件 Allow CORS: Access-Control-Allow-Origin。这款插件可以在web应用程序中轻松执行跨域Ajax请求。请注意,将加载项添加到浏览器时,默认情况下它处于非活动状态(工具栏图标为灰色C字母)。如果要激活加载项,请按一下工具栏上的图标。图标将变为橙色C字母。

如果你没有梯子,谷歌打不开,那么请试试这个Allow CORS: Access-Control-Allow-Origin 。在第三方网站下载插件,然后离线安装到谷歌浏览器。

2、web服务器软件

Nginx 为例,只需要在Nginx的配置文件中配置以下参数:

location / {  add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';if ($request_method = 'OPTIONS') {return 204;}
}

3、后端框架操作

PHP 为例,只需要在文件开头添加如下代码即可:

header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:OPTIONS, GET, POST');
header('Access-Control-Allow-Headers:x-requested-with');

由于我使用的是 PhalApi框架,按照这个教程操作,就可以很容易的解决跨域问题。

4、前端框架操作

Vue 为例,修改 vue.config.js 文件如下:

devServer: {open: true,host: 'localhost',port: 8080,overlay: {warnings: false,errors: true},proxy: {'/api': {target: 'http://blog.pangao.vip',ws: true,changOrigin: true,pathRewrite: {'^/api': ''}}}
}

在需要用到 http://blog.pangao.vip 的地方,均用 api 替代,比如修改 .env.development 文件如下:

VUE_APP_BASE_API = 'api'

后记

最后,再来说说PhalApi框架中的问题。用过PhalApi框架的朋友肯定都知道,url路由访问方式是:

http://dev.phalapi.net/?service=App.Usre.Login

但由于某些原因,我需要以以下方式访问:

http://dev.phalapi.net/App/User/Login

当然,PhalApi框架官网也是写得很清楚需要做哪些操作,以达到这种效果。结果我忘记设置了。

结尾

媳妇说一就是一,事业发达开飞机;
媳妇说五就是五,这样才能开路虎。


更多编程教学请关注公众号:潘高陪你学编程


跨域问题的4种解决方案相关推荐

  1. 前端跨域问题的几种解决方案

    前端跨域问题的几种解决方案 参考文章: (1)前端跨域问题的几种解决方案 (2)https://www.cnblogs.com/xinxingyu/p/6075881.html 备忘一下.

  2. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    跨域的另一种解决方案--CORS(Cross-Origin Resource Sharing)跨域资源共享 参考文章: (1)跨域的另一种解决方案--CORS(Cross-Origin Resourc ...

  3. js跨域解决方案php,详解js跨域原理以及2种解决方案_javascript技巧

    1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本 ...

  4. 跨域的这三种解决方案你知道吗?

    文章目录 什么是跨域? 跨域的三种解决方案 - JSONP 1. 使用原生 js 来书写 JSONP解决跨域问题 2. jQuery 中使用JSONP来解决跨域 - CORS - 搭建代理服务器 什么 ...

  5. 跨域问题的几种解决方案汇总

    来源:github.com/campcc/blog 什么是"跨源" JSONP CORS 兼容性 实现原理 请求类型 PostMessage Websocket Nginx 反向代 ...

  6. 跨域请求的三种解决方案

    跨域的三种解决方案 一.同源策略 二.jsonp 三.cors 四.proxy 一.同源策略 xhr对象无法跨域请求文件.通俗讲就是"浏览器"给js发送请求的限制,你只能给自己域名 ...

  7. 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  8. 解决ajax跨域问题【5种解决方案】

    什么是跨域问题? 跨域问题来源于JavaScript的"同源策略",即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下 ...

  9. 解决ajax跨域问题的5种解决方案

    什么是跨域问题? 跨域问题来源于JavaScript的"同源策略",即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下 ...

最新文章

  1. 《Adobe Flash Professional CC经典教程》——1.3 使用“库”面板
  2. 最新增值税商品税目编码表_大家好!我叫增值税!这是我的最新最全税率表
  3. android 动态修改控件的宽高
  4. html5 数据缓存,HTML5: 本地缓存
  5. C++ STL简介(转)
  6. jquery mobile pc上可以滚动 手机上不能上下滚动_胶天下 | 胶粘剂在手机镜片粘接中的应用...
  7. python基础--面向对象之继承
  8. php编写一个学生类_0063 PHP编程编写学生分数信息编辑和删除功能网页
  9. MATLAB建模与仿真(第一章基础--第四章画图)
  10. 【Python计量】自相关性(序列相关性)的检验
  11. 【测试】你的浏览器HOLD住HTML5吗?
  12. Python中不为人知的四个特性
  13. Linux文件许可权764意味着,chmod 777意味着什么
  14. 2019计算机应用基础平时作业答案,2019年计算机应用基础作业一答案.docx
  15. 每日词根——viv(生命)
  16. Android利用ffmpeg压缩视频
  17. 如何将电脑的代理网络以WIFI热点的方式共享
  18. springboot启动画面看腻了,换一个试试?
  19. 1024 java学习之路。
  20. 16GB大内存该怎么玩儿?

热门文章

  1. 澳洲找IT工作最好用的12个网站, 找实习,找兼职,宝藏网站值得收藏 澳洲求职 Australia Jobs Websites
  2. Java两种动态代理JDK动态代理和CGLIB动态代理
  3. 原创 | 一文读懂K均值(K-Means)聚类算法
  4. java项目如何部署服务器-----如何传输文件到阿里云服务器(三)
  5. QT之灰色头像(类似QQ离线头像)
  6. android开发皮肤检测,android – 检测皮肤和捕获图像
  7. 图像常见格式及转换(BGR,YUV,NV12,YUV444)
  8. Oracle多行合并为单行多列
  9. CISSP vs CISA,该选哪个?
  10. vue实现swiper两端小中间大的效果 圆形