前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(4) 静态前端容器化 - 单页面应用(SAP) History API Fallback - 刷新 404

(4) 静态前端容器化 - 单页面应用(SAP) History API Fallback - 刷新 404

作者头像
老麦
发布于 2025-02-12 07:04:14
发布于 2025-02-12 07:04:14
10300
代码可运行
举报
文章被收录于专栏:Go与云原生Go与云原生
运行总次数:0
代码可运行

(4) 静态前端容器化 - 单页面应用(SAP) History API Fallback - 刷新 404

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2025/02/09/static-sap-history-api-fallback-issue/

当单页面(SAP)页面使用了路由之后(例如 React-Router), 刷新页面就可能造成 404 问题。 问题主要原因是出在 BrowserRouter, 例如 地址 http://localhost:3000/login

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BrowserRouter 依赖于浏览器的 History API 来管理路由。例如,example.com/about 只是一个前端路由,并没有对应的实际 HTML 文件。当你直接在地址栏输入或刷新页面时,服务器会尝试寻找 example.com/about 这个路径的文件,但因为它并不存在,就会返回 404
  1. 刷新页面直接访问时, 浏览器会直接向后端服务器发送请求。
  2. 后端服务器接收到请求, 发现这个也不是自己提供的服务路径, 就直接返回了 404。

解决方法 需要后端在拿到请求后进行判断。 如果不是 静态资源 例如 js, css 就尝试返回固定内容。

1. nginx 解决方法

在 nginx 中, 可以使用 try_files 捕获这种请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
    listen 80;
    server_name example.com;

    root /var/www/html;  # Vite 构建后的 dist 目录
    index index.html;
    
    # 处理前端静态资源
    location / {
        try_files $uri /index.html;
    }

    # 代理 API 请求到 Gin 服务器
    location /api/ {
        proxy_pass http://localhost:8080;  # Gin 服务器地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Gzip 压缩提升性能(可选)
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    gzip_vary on;
}

2. 自定义后端服务器解决方法: gin-gonic/gin

当使用 gin 作为静态服务器的时候, 可以自己创建 中间件(middleware) 处理请求。

  1. 目录模式的情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
 r := gin.Default()
 r.Static("/", "dist")
}

func HistoryAPIFallback() func(c *gin.Context) {
returnfunc(c *gin.Context) {

  path := c.Request.URL.Path
// 如果是 API 请求,或者是静态资源(JS、CSS、图片),则放行
if strings.HasPrefix(path, "/api/") || strings.Contains(path, ".") {
   c.Next()
   return
  }

// 返回固定内容。
  c.File("dist/index.html")
  c.Abort()
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(6) 静态网站容器化 - 【Gin源码】 使用Gin FS模式无限 301 重定向了?
为了解决 BrowserRouter 模式下的, History API Fallback 问题。 我们在后端服务器做了一些兼容配置。
老麦
2025/02/12
930
(6) 静态网站容器化 - 【Gin源码】 使用Gin FS模式无限 301 重定向了?
vite + vue3 部署 Nginx 刷新页面 404
只需要添加 try_files uri uri/ /index.html; 即可。
默存
2023/11/05
1.8K0
vite + vue3 部署 Nginx 刷新页面 404
Vue路由history模式踩坑记录:nginx配置解决404问题
vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载。但是如果我们不想hash这种以#号结尾的路径时候的话,我们可以使用路由的history的模式。比如如下网址:使用hash模式的话,那么访问变成 http://localhost:8080/bank/page/count/#/ 这样的访问,如果路由使用 history的话,那么访问的路径变成 如下:http://localhost:8080/bank/page/count 这样的了;
吟风者
2019/07/24
4.8K0
Umi&React打包部署项目刷新报404错误的几种解决方法
Umi 打包部署到服务器,刷新页面会报 404 错误,这个问题一般是服务端来处理的,比如 Nginx 代理重定向。
德顺
2021/09/10
6.4K0
vue-router之hash与history,以及nginx配置
vue-router的路由模式可以通过指定mode属性值控制,可选值:"hash" 、"history"、 "abstract" , 默认:"hash" (浏览器环境) , "abstract" (Node.js 环境)
甜点cc
2023/10/16
2.2K0
vue-router之hash与history,以及nginx配置
VUE路由设置history模式刷新404处理
vue路由配成history模式,需要设置base,如果不设置base刷新页面会报404错误 const router = new Router({     mode: 'history',     base: '/weegClient/',     routes }) 打包时vue.config.js配置 module.exports = {     // publicPath: '/', // 根路径 /pages/dist/     publicPath: '/weClient',
tianyawhl
2023/01/15
1.8K0
前端路由两种模式:hash与history
SPA需要在不刷新页面的情况下做页面更新,这就需要前端路由。实际上,前端路由是利用浏览器的hash和history属性
用户3258338
2020/06/19
8370
面试官:vue项目如何部署?有遇到布署服务器后刷新404问题吗?
前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可
@超人
2021/02/26
8.4K0
面试官:vue项目如何部署?有遇到布署服务器后刷新404问题吗?
vue项目history模式刷新404问题
vue项目history模式部署到服务器后 ,根路径访问没有问题,但是进入其他功能再刷新页面就会出现404,因为你没在nginx或者apache配置上面加上重定向跳转。 解决办法,只需要加上这段配置:
FGGIT
2024/10/15
1340
vue-router的hash模式和history模式
开发中一直在用 vue,也知道 Vue Router 有 hash 和 history 两种模式,hash 模式路径中会带上 # 符号,看着不美观;history 模式路径中则没有 #,路径看着更漂亮,但是需要服务器配合设置,所以我们项目中一般都是使用 history 模式。之前对于 的理解也就限于这些了,后面学了服务器部署、nginx这些但还是一知半解。
人人都是码农
2023/11/16
3920
vue项目代码部署发布总结
在一般情况下,vue项目代码部署发布只需将代码打包后直接上传到服务器即可。但在一个比较彻底的前后端分离业务中,这样的操作就行不通了,这篇文章将重点针对这种情况做分析总结。
挥刀北上
2019/08/06
1.8K0
vue项目代码部署发布总结
前端工程化 - 如何玩转 Nginx (上)
在前端项目开发中,我们可以启动 devserver 管理静态资源服务,但是发布线上后要保证稳定,一般会选择一个高效能 + 稳定的静态服务器来管理前端资源。
Cookieboty
2022/05/16
6490
前端工程化 - 如何玩转 Nginx (上)
React 项目部署后,页面404解决
本地运行,URL为真实的URL,BrowserRouter 可以直接访问到真实 URL。 但是项目打包后,当页面刷新或跳转新页面时,客户端浏览器会向服务器请求URL。 服务器会去找build文件夹下的html文件,发现找不到URL指定的路径。 这是因为实际上并没有这样的物理路径,或者没有配置路由请求,所以内容无法显示,而显示404错误。
白墨石
2023/01/05
3.5K0
Vue下路由History mode导致页面无法渲染的原因
用 Vue.js + vue-router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。
全栈程序员站长
2022/07/07
8770
Vue下路由History mode导致页面无法渲染的原因
Vue部署服务器,刷新页面 404/502 报错
在vue项目中,部署项目到服务器的时候报404/502的错误 一般可以用hash()和history.pushState() 作为路由跳转,就下面这样滴 如果用下面的这个去 run build 就会报404的错误或者502
〆 千寻、
2020/03/11
2.4K0
React.js Vue.js 项目部署页面刷新404
使用react,vue等开发的项目因为是前后端分离,所有打包发布到服务器以后,需要放在一个静态服务器中运行
零式的天空
2022/03/24
4.5K0
Ant Design Pro 部署到 aliyun oss 遇到的一个小问题
以往我们都是买一台服务器托管,然后把前端页面和后端服务放在同一台机器上,把域名解析到这台服务器,通过nginx绑定域名,并指向到前端页面所在目录,前端页面请求接口,就配置nginx代理转发,比如匹配到 '/xxxx',就转发到后台服务上。
前端人人
2019/05/31
2.5K0
Vue项目History模式404问题解决
本人是Java后台开发,Vue其实使用也没有多久,只能说简单了解。发现问题的时候其实也一头雾水,第一思想就是百度看别人的思路。
dalaoyang
2018/12/06
1.4K0
Vue项目部署问题及解决方案
Vue-Router 有两种模式,默认是 hash 模式,另外一种是 history 模式。
半指温柔乐
2019/02/25
2.1K0
Nginx部署Vue项目以及解决刷新页面404
1.在项目中的package.json上右键,点击Show npm Scripts
IT大咖说
2020/09/23
6.1K0
Nginx部署Vue项目以及解决刷新页面404
相关推荐
(6) 静态网站容器化 - 【Gin源码】 使用Gin FS模式无限 301 重定向了?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档