【前端】几种常见的跨域解决方案

devtools/2025/2/11 6:36:42/

前端开发中,跨域问题是常见的挑战。以下是几种常见的跨域解决方案:

1. Nginx反向代理

使用 Nginx 进行反向代理是解决跨域问题的一种常见方式。Nginx 会充当一个中间代理服务器,接收来自前端的请求并将其转发到实际的后端 API 服务,从而避免跨域问题。

  1. 安装 Nginx
    如果你还没有安装 Nginx,可以使用以下命令安装:

    • Ubuntu/Debian:

      sudo apt update
      sudo apt install nginx
      
    • CentOS/RHEL:

      sudo yum install nginx
      
  2. 配置 Nginx 反向代理
    打开 Nginx 的配置文件,通常是在 /etc/nginx/nginx.conf 或者 /etc/nginx/sites-available/default,根据你的操作系统和 Nginx 安装方式来决定。

    下面是一个示例配置,假设你的前端应用在 http://localhost:8080,后端 API 服务在 http://api.example.com

    server {listen 80;# 前端应用访问的地址server_name localhost;location / {root /var/www/html;  # 指定前端应用的根目录index index.html index.htm;}# 配置反向代理location /api/ {proxy_pass http://api.example.com/;  # 反向代理到后端 API 服务proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
    }
    
  3. 说明:

    • proxy_pass http://api.example.com/;: 将所有 /api/ 路径的请求转发到 http://api.example.com
    • proxy_set_header 相关指令用于转发客户端的请求头信息到后端服务器,这样后端可以获得真实的请求信息。
  4. 重载 Nginx 配置
    在修改 Nginx 配置文件后,需要重载 Nginx,使配置生效:

    sudo nginx -s reload
    

前端应用请求 http://localhost/api/xyz 时,Nginx 会将这个请求转发到 http://api.example.com/api/xyz,并将响应返回给前端

注意事项

  • CORS 头部:如果后端已经配置了 CORS 头部,那么你可以在 Nginx 上的代理配置中添加相关的 CORS 头部,或者在后端服务中处理:

    location /api/ {proxy_pass http://api.example.com/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# CORS 头部add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'Origin, X-Requested-With, Content-Type, Accept, Authorization';
    }
    
  • 路径重写:有时需要在代理时对路径进行重写。例如,前端请求 /api,但后端实际接收的路径是 /v1/api,这时可以使用 rewrite 来修改请求路径:

    location /api/ {rewrite ^/api/(.*)$ /v1/$1 break;proxy_pass http://api.example.com/;
    }
    

2. H5跨域 JSONP方式(通过script标签)

JSONP(JSON with Padding)是一种古老的跨域解决方案。原理是利用

<!DOCTYPE html> 
<html lang="en"> <head> <meta charset="UTF-8"> <title>JSONP跨域示例</title> 
</head> <body> <script> function jsonpCallback(data) { console.log(data);  } </script> <script src="http://目标服务器地址?callback=jsonpCallback"></script> 
</body> </html> 

这里http://目标服务器地址是提供数据的服务器地址,callback=jsonpCallback是将回调函数名作为参数传递给服务器,服务器收到请求后,会将数据包装在回调函数中返回,例如返回的数据可能是jsonpCallback([{ “name”: “张三”, “age”: 25 }]),这样前端页面就可以通过回调函数获取到跨域的数据。

3 .uni-app在manifest.json中配置代理来解决:

"h5": {"devServer": {"https": false,"port": 8080,"proxy": {"/apis": {"target": "https://www.ucharts.cn","changeOrigin": true,"pathRewrite": {"^/apis": ""}}}}
}

这将把以/apis开头的请求代理到https://www.ucharts.cn,从而解决跨域问题。

4. 去掉www前缀

有些情况下,去掉访问地址的www前缀可能会解决跨域问题。这是因为有些服务器配置中,www子域名和主域名被视为不同的域。当去掉www前缀后,可能会使请求在同源策略下被允许。

例如,原本请求www.example.com 会出现跨域问题,尝试访问example.com 可能就不会有跨域限制。但这种方法并不是通用的解决方案,它取决于服务器的具体配置,而且也可能带来一些其他问题,比如搜索引擎优化(SEO)方面的影响等。同时,如果是因为协议、端口不同导致的跨域,这种方法也无法解决。

5. Chrome浏览器的跨域设置(适用于本地临时跨域)

在开发过程中,可能需要临时绕过浏览器的同源策略。可以通过启动Chrome浏览器时添加特定参数来实现:

将谷歌浏览器的桌面快捷方式复制一份,右键属性将**目标(T)😗*的路径后输入–disable-web-security --disable-web-security --user-data-dir=C:\chromTest参数
以下为参考:

"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --disable-web-security --user-data-dir=C:\chromTest

在这里插入图片描述

这将启动一个禁用Web安全策略的Chrome实例。请注意,这种方法仅适用于开发环境,且存在安全风险,务必谨慎使用。


http://www.ppmy.cn/devtools/157848.html

相关文章

内蒙古蒙东某露天煤矿隆起自动化监测

1. 项目简介 该矿山是一家集煤炭生产、加工、销售于一体的国有大型露天煤矿&#xff0c;是国家重点建设的13个大型煤炭基地之一&#xff0c;是国家能源重点发展地区。该矿脉储量丰富、资源可靠、开采条件优越、市场条件良好&#xff0c;煤种属于老年褐煤&#xff0c;具有挥发分…

ES传输带宽优化方案

背景&#xff1a;目前日志从kafka中消费后转存ES,是通过批量发送的方式打入ES&#xff0c;但是如果数据量很大那么就会占用很多的带宽&#xff0c;而目前正在降本增效&#xff0c;无法增加带宽或者服务节点。 源码在最下方&#xff01;&#xff01; 限流牺牲磁盘作为代价 从…

【AI学习】LLM的发展方向

个人的思考&#xff0c;请大家批评。 这一轮AI浪潮&#xff0c;叙事的主要逻辑就是scaling law&#xff0c;模型越大&#xff0c;性能越好&#xff0c;投入越大&#xff0c;性能越好&#xff0c;回报越高&#xff0c;等等。当然&#xff0c;首先要有一个能够scaling的模型架构…

深入 JVM 虚拟机:字符串常量池演变与 intern() 方法工作原理解析

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 📝 如有错误敬请纠正! 前言 在 Java 开发中,字符串常量池(String Constant…

web前端布局--使用element中的Container布局容器

前端页面&#xff0c;跟Qt中一样&#xff0c;都是有布局设置的。 先布局&#xff0c;然后再在各布局中添加显示的内容。 Element网站布局容器&#xff1a;https://element.eleme.cn/#/zh-CN/componet/container 1.将element相应的布局容器代码layout&#xff0c;粘贴到vue项…

git 分支详解

语句 1、git branch 没有接任何参数&#xff0c;则会输出当前项目的所有分支 2、新增分支 git branch 分支名字// 示例 git branch liu 3、更改分支名称 git branch -m 旧分支名 新分支名// 示例 git branch -m liu new_liu 4、删除分支 git branch -d 分支名//示例 git…

【MQ】Spring3 中 RabbitMQ 的使用与常见场景

一、初识 MQ 传统的单体架构&#xff0c;分布式架构的同步调用里&#xff0c;无论是方法调用&#xff0c;还是 OpenFeign 难免会有以下问题&#xff1a; 扩展性差&#xff08;高耦合&#xff0c;需要依赖对应的服务&#xff0c;同样的事件&#xff0c;不断有新需求&#xff0…

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…