起因是在本地调试出来一个免费api获取天气的小功能,结果放服务器上却显示因同源问题,访问被拒绝,于是乎只能全部推倒重来。有同源问题的数据利用php去请求,可前端请求数据的仍旧由前端来做,最终成了一个前后端接力的形式。
JavaScript跨域问题
JavaScript会产生跨域问题而PHP不会,这主要是由于浏览器实施的同源策略(Same-Origin Policy)限制,而PHP作为服务器端语言不受此限制。以下是具体原因:
同源策略是浏览器实现的安全机制,只影响在浏览器中运行的JavaScript,跨域限制包括:AJAX请求、Cookie/LocalStorage访问、DOM操作等;而PHP 运行在服务器上,不受浏览器安全策略约束,直接通过服务器间通信,没有这些限制。
为什么是JavaScript
客户端执行:JavaScript 代码在用户浏览器中执行,可能被恶意利用
保护用户数据:防止恶意网站窃取其他网站的用户会话或敏感数据
限制场景:XMLHttpRequest、Fetch API、WebSocket等都会受到同源策略检查
为什么不是php
服务器端执行:PHP 代码在服务器上运行,可以自由访问任何外部资源
直接HTTP请求:PHP 使用如file_get_contents()
、cURL
等函数发起请求,这些是服务器间通信
无浏览器干预:请求不经过用户浏览器,没有同源策略检查环节
一句话总结: 你(浏览器)管不着~
解决方案
要解决JavaScript跨域问题,可以使用CORS、JSONP、代理服务器等技术方案。
1.CORS (跨域资源共享)
原理:服务器设置响应头,明确允许哪些域可以访问资源
2.JSONP (JSON with Padding)
原理:利用<script>
标签不受同源策略限制的特性
3.代理服务器
原理:让同源服务器转发请求,避开浏览器限制
4.WebSocket
原理:WebSocket协议不受同源策略限制
5.postMessage
原理:跨文档消息传递机制,可用于iframe/窗口间通信
6.document.domain (子域跨域)
原理:设置相同的基础域实现子域间通信
7.浏览器禁用安全策略 (仅开发用)
临时解决方案:
Chrome启动参数:--disable-web-security --user-data-dir=/tmp
注意:仅用于本地开发测试,绝对不要在生产环境使用
最佳实践建议
优先使用CORS:现代API首选方案,安全可控
开发环境用代理:避免修改生产API配置
传统系统用JSONP:支持旧浏览器但注意安全
实时通信用WebSocket:适合双向数据流
跨窗口用postMessage:安全可靠
安全注意事项
CORS中谨慎使用Access-Control-Allow-Origin: *
JSONP要验证来源防止XSS
代理服务器要过滤敏感头信息
postMessage必须验证event.origin