Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】

Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】

文章目录


在这里插入图片描述

一、前言

在前后端分离架构中,前端访问后端资源(尤其是图片、文件等静态资源)的反向代理配置是一个常见且容易踩坑的问题。最近在开发一个 Vue3 + .NET8 的项目时,我就遇到了开发环境配置正常,但部署到生产环境后图片无法访问的问题。本文将详细记录这个问题的解决过程,并给出开发环境和生产环境的完整代理配置方案。

二、问题场景

  • 前端:Vue3 项目,运行在 80 端口
  • 后端:.NET8 WebAPI,运行在 5005 端口
  • 需求:前端通过 http://domain.com/upload/xxx.jpg 访问后端 http://domain.com:5005/upload/xxx.jpg 的图片资源

开发环境下使用 Vite 的代理配置工作正常,但部署到生产环境后出现 404 错误。

三、开发环境配置(Vite)

vite.config.ts 中的配置如下:

exportdefaultdefineConfig({ server:{ proxy:{'^/[Uu]pload':{ target:'http://localhost:5005', changeOrigin:true,}}}})

这个配置实现了:

  1. 匹配所有以 /upload/Upload 开头的请求
  2. 转发到后端服务 http://localhost:5005
  3. changeOrigin: true 处理跨域问题

四、生产环境配置(Nginx)

4.1 初始错误配置

我最初尝试的 Nginx 配置:

location /upload { proxy_pass http://localhost:5005/upload; } 

这个配置会导致路径重复拼接,访问 http://domain.com/upload/xxx.jpg 实际会转发到 http://localhost:5005/upload/upload/xxx.jpg,显然不正确。

4.2 正确配置方案

经过研究和实践,正确的 Nginx 配置应该是:

server { listen 80; server_name domain.com; # 前端静态资源 location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } # 代理上传文件请求 location ~* ^/upload { proxy_pass http://localhost:5005; 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; } } 

4.3 配置解析

  1. location ~* ^/upload
    • ~* 表示不区分大小写的正则匹配
    • 匹配所有 /upload/Upload 开头的请求
  2. proxy_pass
    • 直接指向后端地址,不加 /upload 后缀
    • 这样会保留原始请求路径
  3. proxy_set_header
    • 传递必要的请求头信息
    • 确保后端能获取到真实的客户端信息

4.4高级配置选项

  1. 路径重写
    如果后端接口路径与前端的路径不一致,可以使用 rewrite 规则:
location ~* ^/upload { rewrite ^/upload/(.*) /api/upload/$1 break; proxy_pass http://localhost:5005; } 
  1. 负载均衡
    如果后端有多台服务器:
upstream backend { server 192.168.1.101:5005; server 192.168.1.102:5005; } location ~* ^/upload { proxy_pass http://backend; } 
  1. 静态资源缓存
    对图片等静态资源启用缓存:
location ~* ^/upload { proxy_pass http://localhost:5005; proxy_cache my_cache; proxy_cache_valid 200 304 1h; proxy_cache_key "$scheme$request_uri"; } 

五、常见问题排查

  1. 404 Not Found
  • 检查后端服务是否真的存在该文件
  • 确认 Nginx 的转发路径是否正确
  • 查看 Nginx 错误日志:tail -f /var/log/nginx/error.log
  1. 权限问题
    确保 Nginx 有权限访问后端服务:
chmod -R 755 /path/to/upload chown -R www-data:www-data /path/to/upload 
  1. 缓存问题
    强制刷新浏览器缓存:Ctrl + F5

六、开发环境 vs 生产环境对比

功能 开发环境(Vite)生产环境(Nginx)
匹配规则^/[Uu]pload(正则)
目标地址env.VITE_API_URL
路径修改自动
跨域处理changeOrigin: true
性能优化

七、总结

通过本文的配置,我们实现了:

  1. 开发环境和生产环境一致的代理行为
  2. 不区分大小写的路径匹配
  3. 完整的请求头传递
  4. 灵活的路径重写能力

关键点在于理解 Nginxproxy_pass 行为:

  • proxy_pass 包含 URI 时,会替换 location 匹配的部分
  • proxy_pass 不包含 URI 时,会保留原始请求路径

希望这篇指南能帮助你顺利解决前后端分离项目中的反向代理问题。如果仍有疑问,欢迎在评论区留言讨论!

Read more

手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人

手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人

手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人 当前版本 OpenClaw(2026.2.22-2)已内置飞书插件,无需额外安装。 你有没有想过,在飞书里直接跟 AI 对话,就像跟同事聊天一样自然? 今天这篇文章,带你从零开始,用 OpenClaw 搭建一个飞书 AI 机器人。全程命令行操作,10 分钟搞定。 一、准备工作 1.1 安装 Node.js(版本 ≥ 22) OpenClaw 依赖 Node.js 运行,首先确保你的 Node 版本不低于 22。 推荐使用 nvm 管理 Node

By Ne0inhk

Gemini 全能 QQ 机器人部署手册 (V1.0 Release)

Gemini 全能 QQ 机器人部署手册 (V1.0 Release) 核心架构:OneBot V11 (NapCat) + NoneBot2 + Gemini Flash 适用系统:Ubuntu 22.04 LTS (阿里云/腾讯云) 🟢 第一阶段:基础设施准备 SSH 连接服务器后,复制以下命令执行。 安装必要软件 (Docker + Python) # 更新软件源sudoapt update &&sudoapt upgrade -y# 安装 Dockercurl-fsSL https://get.docker.com |bash# 安装 Python3 及虚拟环境工具sudoaptinstall python3-pip python3-venv -y# 创建项目文件夹mkdir-p

By Ne0inhk

OpenClaw多智能体路由实战:飞书多机器人配置指南

文章目录 * 飞书重新安装问题 * 批量增加机器人 * 缺点 * 多个飞书机器人名称包含大小写的问题 * 多个Agent名称包含大小写的问题 目前我已经完成了OpenClaw的基本安装,但是在对话框只有一个,机器人也只绑定到主会话,一次只能处理一个消息。很多时候我在聊天窗口,说A任务,然后做了一半,又发了关于B任务的指令。一是每次发完消息,如果OpenClaw还在处理,剩下的消息要么进入队列、要么看不到(实际还在队列)。两个任务切来切去,感觉体验很不好。 要彻底解决这个问题,实现网上演示的那种对各Agent、每个对话机器人对应一个Agent,就需要用到多智能体路由技术。 实现的步骤如下: * 在飞书创建一个新的机器人 * 通过控制台创建新的智能体 * 按照指引将飞书配置上去 * 根据需要创建多个Agent和机器人,并对应配置上去(略) 飞书重新安装问题 明明我已经安装好了飞书,系统还是会提示我安装,否则就跳过了添加飞书这步。应该是系统Bug。这次安装的飞书位置在~/.openclaw/extensions/feishu,其实和~/.npm-globa

By Ne0inhk
【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)

【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)

文章目录 * Redis入门与应用 * Redis常用数据结构 * 集合(set) * 集合内操作命令 * sadd 添加元素 * srem 删除元素 * scard 计算元素个数 * sismember 判断元素是否在集合中 * srandmember 随机从集合返回指定个数元素 * spop 从集合随机弹出元素 * smembers 获取所有元素(不会弹出元素) * 集合间操作命令 * sinter 求多个集合的交集 * suinon 求多个集合的并集 * sdiff 求多个集合的差集 * 将交集、并集、差集的结果保存 * 使用场景 * 有序集合(ZSET) * 集合内操作命令 * zadd添加成员 * zcard 计算成员个数 * zscore 计

By Ne0inhk