前端跨域全攻略:从 Vite 代理到 Nginx 生产环境配置实战

前言

在前后端分离的架构中,跨域(CORS)是我们联调接口时遇到的第一个"拦路虎"。无论是本地开发还是线上部署,掌握跨域的解决手段是前端开发者的基本功。本文将结合 Vite 和 Nginx,深度解析跨域问题的终极解决方案。

一、 什么是跨域?

跨域 是由浏览器的同源策略(Same-origin policy)引起的。当一个请求的协议、域名、端口三者中至少有一个不同时,浏览器就会拦截该请求的响应。

注意:跨域请求其实已经发到了服务器,服务器也正常返回了数据,只是浏览器在接收响应时,发现源不匹配,为了安全将其拦截了。


二、 开发环境方案:Vite 反向代理

在开发阶段,我们无法要求后端频繁改动 CORS 配置。此时,利用 Vite 自带的 http-proxy 模块进行转发是最优解。

1. Vite 配置实战

vite.config.js 中配置 server 对象,通过代理服务器绕过浏览器同源策略:

javascript 复制代码
export default defineConfig({
  server: {
    port: 3000,
    cors: true, // 启用并允许任何源(主要用于开发服务器的响应头)
    open: true, // 启动时自动打开浏览器
    
    // 反向代理配置
    proxy: {
      // 场景 A:不移除路径前缀
      // 例如请求 /aPath/login 会转发到 http://33.133.190.116:8100/aPath/login
      "/aPath": {
        target: "http://33.133.190.116:8100", 
        changeOrigin: true, // 必须设置为 true,否则后端无法获取正确的 Host
      },
      
      // 场景 B:重写路径(移除前缀)
      // 例如请求 /bPath/list 会转发到 http://172.16.7.160:9022/list
      "/bPath": {
        target: "http://172.16.7.160:9022",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^/bPath/, ""),
      },
    },
  },
})

三、 生产环境方案:Nginx 部署配置

项目上线后,Vite 的代理就不起作用了。此时我们需要在 Nginx 中配置反向代理,让所有的请求由 Nginx 统一分发。

1. Nginx 核心配置文件解析 (nginx.conf)

Nginx 复制代码
# 基础全局配置
user nginx;
worker_processes auto; # 自动适配 CPU 核心数
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    use epoll; # 使用高性能事件驱动模型
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    client_max_body_size 300m; # 支持大文件上传

    # 开启 Gzip 压缩,优化传输性能
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript;

    server {
        listen 80 default_server;
        server_name _; 

        # 静态资源处理
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
            try_files $uri $uri/ /index.html; # 适配单页面应用路由
        }

        # 代理方案 A:带前缀转发
        # 请求:/aPath/api -> http://33.133.190.116:8100/aPath/api
        location ^~/aPath/ {
            proxy_pass http://33.133.190.116:8100/aPath/;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_read_timeout 3600s;
            proxy_buffering off; # AI 对话场景需关闭缓冲
            chunked_transfer_encoding on;
        }

        # 代理方案 B:抹除前缀转发
        # 请求:/bPath/api -> http://172.16.7.160:9022/api
        location ^~/bPath/ {
            proxy_pass http://172.16.7.160:9022/; 
            proxy_set_header X-Forwarded-For $remote_addr;
        }

        # 禁止访问 .ht 文件
        location ~ /.ht {
            deny all;
        }
    }
}

四、 补充

1. 后端 CORS 配置(简单请求与预检请求)

后端通过在响应头中添加特定字段,告诉浏览器允许该源的访问:

  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Methods: GET, POST, PUT, DELETE

2. 为什么 Nginx 代理能解决跨域?

因为 "跨域"仅存在于浏览器端 。 当你的前端代码请求 Nginx 时,它们同源;Nginx 作为中转站再去请求后端接口,这是 服务器对服务器的通信,不受同源策略限制。

相关推荐
文心快码BaiduComate16 分钟前
从个人效能到组织资产:文心快码企业版Agent Hub上线,提升团队AI编程效能
前端·后端·程序员
咖啡星人k31 分钟前
从需求到交付:我用MonkeyCode的AI Agent完成了一个React数据看板
前端·人工智能·react.js·monkeycode
sxlishaobin33 分钟前
linux 自动清除日志 脚本
linux·服务器·前端
ZC跨境爬虫43 分钟前
跟着 MDN 学CSS day_37:(从文档流到粘性定位的底层原理)
前端·javascript·css·ui·html
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
nginx部署教程
运维·网络·nginx
IccBoY1 小时前
NVM超详细全解教程:解决Node版本冲突(Win/Mac/Linux安装+使用+踩坑合集)
前端·node.js
wuhen_n1 小时前
前端工程师进阶提示词工程实战
前端·langchain·ai编程
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?
java·数据库·mysql·面试·哈希算法
GISer_Jing1 小时前
Claude Code MCP Server 集成全解析
前端·人工智能·ai·架构
蚰蜒螟1 小时前
走进 Linux 内核:从 touch 命令到磁盘 inode 的完整旅程
java·linux·前端