【Java后端】【nginx】nginx配置重定向问题记录 📅 发布时间:2026/7/12 1:31:02 👁️ 浏览次数: Nginx 子路径部署 React SPA 踩坑总结背景将 React 单页应用SPA部署在 Nginx 子路径/company/、/company-admin/下与个人博客/共用同一台服务器过程中遇到了三个典型问题。问题一aliastry_files回退路径错误现象刷新页面如/company/products或直接访问子路由时返回 404 或跳转到根路径。错误配置location /company/ { alias /var/www/company-font/; index index.html; try_files $uri $uri/ /company/index.html; # ❌ 错误 }根因在alias块中try_files的回退路径/company/index.html是相对于全局root如/var/www/personal-website解析的而不是alias指定的目录。该路径不存在导致 Nginx 触发异常跳转。正确配置location /company/ { alias /var/www/company-font/; index index.html; try_files $uri $uri/ /var/www/company-font/index.html; # ✅ 使用绝对路径 }结论在alias块中try_files的 fallback 必须使用文件系统绝对路径。问题二无尾斜杠路径/company被错误路由现象访问http://example.com/company无尾斜杠时返回了个人博客首页而不是企业官网。根因Nginx 的location /company/带尾斜杠不匹配/company无尾斜杠请求该请求被location /兜底处理返回了/var/www/personal-website/index.html。修复新增精确匹配 location将无尾斜杠请求 301 重定向到有尾斜杠路径location /company { return 301 /company/; } location /company-admin { return 301 /company-admin/; }问题三React 登录后navigate(/)跳出子路径现象用户登录成功后页面跳转到了http://example.com/而不是http://example.com/company/。根因分析React Router v6 中BrowserRouter设置了basename/companynavigate(/)理论上会跳转到/company/。但实际触发跳出的原因是旧代码在navigate(/)之后紧接着调用了window.location.reload()navigate是异步的reload()在路由未完成切换时执行此时 URL 还在/company/loginreload 触发浏览器刷新命中了上述问题二/company无斜杠被个人博客兜底最终落到了根路径修复移除window.location.reload()改用navigate的replace选项// ❌ 旧代码navigate(/);window.location.reload();// ✅ 新代码navigate(/,{replace:true});问题四登录后 Navbar 状态不同步现象登录成功跳转回首页后Navbar 仍然显示登录/注册按钮没有变成用户信息。根因Navbar 组件读取登录状态的useEffect依赖数组为空只在组件挂载时执行一次。登录操作在 Login 组件中完成写入 localStorage 后 Navbar 不会感知到变化。// ❌ 问题代码只在挂载时读一次useEffect((){setLoggedIn(isAuthenticated());setUser(getUser());},[]);修复登录时派发自定义事件Navbar 监听该事件刷新状态Login.jsxsetToken(data.token);setUser({username,nickname,role});window.dispatchEvent(newEvent(auth-change));// 通知 Navbarnavigate(/,{replace:true});Navbar.jsxconstrefreshAuthuseCallback((){setLoggedIn(isAuthenticated());setUser(getUser());},[]);useEffect((){refreshAuth();window.addEventListener(auth-change,refreshAuth);return()window.removeEventListener(auth-change,refreshAuth);},[refreshAuth]);最终完整 Nginx 配置server { listen 80; server_name _; root /var/www/personal-website; index index.html; client_max_body_size 20m; # 无尾斜杠重定向防止被 location / 兜底 location /company { return 301 /company/; } location /company-admin { return 301 /company-admin/; } # 个人博客根路径 location / { try_files $uri $uri/ /index.html; } # 企业官网前端 location /company/ { alias /var/www/company-font/; index index.html; try_files $uri $uri/ /var/www/company-font/index.html; } # 管理后台前端 location /company-admin/ { alias /var/www/company-admin/; index index.html; try_files $uri $uri/ /var/www/company-admin/index.html; } # 后端 API去掉前缀后转发 location /company-api/ { rewrite ^/company-api/(.*)$ /api/$1 break; proxy_pass http://127.0.0.1:9080; 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; } }总结问题根因修复要点alias try_files 404fallback 路径相对于 root 解析使用文件系统绝对路径无尾斜杠被根路径兜底location /company/不匹配/company新增location /company做 301 跳转登录后跳出子路径window.location.reload()与异步 navigate 竞争移除 reload用navigate(/, { replace: true })登录后 Navbar 不更新useEffect 空依赖只执行一次自定义事件auth-change跨组件通知
基于下垂控制的三相逆变器:电压电流双闭环控制的Matlab/Simulink/PLECS仿真模型 基于下垂控制的三相逆变器闭环控制仿真 采用电压电流双闭环控制,输出特性好,动态响应快 matlab/simulink/plecs等仿真模型 ~三相逆变器下垂控制这玩意儿最近在微电网圈子里火得不行。前两天帮学弟调仿真模型,发现这货的动态响应确实有两把刷子… 2026/7/3 19:09:26
保定中小型餐饮门店现制热饮设备选型与技术运营实践 一、 痛点分析:传统早餐店热饮运营的技术瓶颈 在保定地区的中小型早餐店运营场景中,现制热饮(以豆浆为代表)的标准化、稳定性与成本控制是核心挑战。以行业常见的永和豆浆商用原料为例,其标准化的产品规格(… 2026/7/11 8:38:53
基于阶梯碳交易成本的‘含电转气-碳捕集(P2G-CCS)耦合的综合能源系统低碳经济优化调度‘... 基于阶梯碳交易成本的含电转气-碳捕集(P2G-CCS)耦合的综合能源系统低碳经济优化调度,采用(MatlabYalmipCplex) 考虑P2G设备、碳捕集电厂、风电机组、光伏机组、CHP机组、燃气锅炉、电储能、热储能、烟气存储罐。最近在… 2026/7/12 4:51:59
虚拟机创建逻辑卷 1. 添加硬盘2.制作物理卷#物理卷是LVM 的底层存储载体,可以是整个硬盘、硬盘分区或类似 RAID 的设备#用硬盘分区制作1.查看添加的硬盘设备文件名[rootA ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 10G 0 disk2.分区… 2026/7/12 7:28:00
YOLO11模型C++部署实战:从ONNX导出到NMS后处理全流程解析 1. 项目概述:从模型到产品的最后一公里做AI项目,尤其是目标检测,最让人头疼的往往不是训练模型,而是那句老话:“模型在手,落地发愁”。你辛辛苦苦调参、炼丹,在PyTorch里跑出了漂亮的mAP&#x… 2026/7/12 7:28:00
UE5 3D UI渲染避坑指南:三种方案解决场景遮挡难题 1. 项目概述:3D UI的“穿墙”难题与核心诉求在UE5里做3D UI,最让人头疼的莫过于你精心设计的血条、交互面板或者信息标签,动不动就被场景里的墙壁、角色或者一堆杂物给挡得严严实实。想象一下,你做了一个悬停在角色头顶的3D名字板… 2026/7/12 7:25:59
C++线程池实战:从原理到实现,解决高并发性能瓶颈 1. 项目概述最近在重构一个老项目的后台服务,性能瓶颈卡在了频繁创建和销毁线程上。每次来一个请求就new std::thread,请求处理完就join,这种模式在低并发时还行,一旦QPS上来,线程创建和销毁的开销直接让CPU在上下文切… 2026/7/12 7:23:58
Flink 窗口聚合状态管理:从GROUPING SETS到多级窗口的3个进阶场景 Flink 窗口聚合状态管理:从GROUPING SETS到多级窗口的3个进阶场景在实时数据处理领域,窗口聚合是构建复杂分析管道的核心工具。当我们需要从原始事件流中提取业务洞察时,仅仅掌握基础窗口操作往往难以应对真实场景中的多维分析需求。本文将深… 2026/7/12 7:23:58
合同到期总忘记?5种自动提醒方法对比,最后一种最省心 合同到期总忘记?5种自动提醒方法对比,最后一种最省心企业签订的合同少则几十份,多则数千份,每一份合同背后都有履行期限、付款节点、续约窗口。一旦某个关键日期被遗漏,轻则错失续约机会、影响业务连续性,重… 2026/7/12 7:21:58
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14