当前位置: 首页 > news >正文

python http server运行Angular 单页面路由时重定向,解决404问题

问题

当Angular在本地ng server运行时候,可以顺利访问各级路由。
但是运行ng build后,在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。
在服务器下我们第一次访问路由页面时是没有问题的,但是尝试刷新页面或手动输入路由地址,会发现页面变成了404,
在这里插入图片描述
可以看到控制台报警 GET http://localhost:8004/b-component 404 (File not found), 我们在debug模式下是没有问题的,但是在打包服务器环境下运行就不行了。
有其他文章说 使用hash 路由可以解决问题,但是hash路由毕竟不是主流的路由方式。
目前使用重定位路由解决。

解决方式

一 创建文件

由于我们使用的是 python的 http server。所以我们创建python 脚本,src/server.py
代码如下:

import http.server
import socketserver
import os , reclass MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):# #方法一:根据路由地址判断# if self.path in ['/', '/a-component', '/b-component', '/c-component']:#     self.path = 'index.html'#方法二:根据文件后缀判断# 排除一些可能的无后缀静态资源# path 里面不含有 . 后缀的都认为是路由地址if re.match(r'^\/(?!robots\.txt|sitemap\.xml|manifest\.json).*', self.path) and '.' not in self.path:self.path = 'index.html'return http.server.SimpleHTTPRequestHandler.do_GET(self)handler_object = MyHttpRequestHandlerPORT = 8004
my_server = socketserver.TCPServer(("", PORT), handler_object)my_server.serve_forever()

代码里面,创建了一个自定义的 http.server
当页面请求到固定的路由地址的时候,将请求重定向到了index.html文件,因为我们打包后只有index.html文件,并没有其他的网页文件,所以请求的资源找不到。
这里简单有几种判断方式:

  • 一:枚举所有的重定向地址,如果网页有改动的话需要动态更高
  • 二:根据响应的规则,判断如果是路由地址的话,就重定向到index.html,此规则需要根据实际情况修改
  • 三:在ng build 后,编写脚本,通过js或者python,读取src/app/app.routes.ts文件里面的所有路由地址,存入文件,然后在服务器脚本里面读取判断(未做)

配置拷贝

在angular.json 中添加"src/server.py",这样当build的时候,会拷贝 server.py 在dist 的index.html的同级目录
在这里插入图片描述

打包

运行 ng build

运行服务器

进入打包目录后,运行 server.py

  • cd …/dist/btest/browser
  • python3 server.py

访问网页正常

在这里插入图片描述

http://www.lryc.cn/news/523704.html

相关文章:

  • GPT-4o背后的语音技术
  • 微透镜阵列精准全检,白光干涉3D自动量测方案提效70%
  • Spring boot框架下的RocketMQ消息中间件
  • 记录一次 centos 启动失败
  • C++学习第五天
  • openharmony标准系统方案之瑞芯微RK3568移植案例
  • 深入理解 SSH 端口转发:本地 vs 远程 vs 动态转发
  • postman请求参数化
  • 基于 WEB 开发的汽车养护系统设计与实现
  • Nginx正向代理配置
  • 本地仓库管理之当前分支内的操作
  • 《内网穿透:网络拓展与安全防护的平衡艺术》
  • 【python写个可以运行的2048小游戏】
  • 【Flink系列】9. Flink容错机制
  • DETR论文阅读
  • 关于vite+vue3+ts项目中env.d.ts 文件详解
  • 如何优化Elasticsearch大文档查询?
  • Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正
  • Linux中DataX使用第一期
  • [Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器
  • 关于机器学习的一份总结
  • 推荐一个开源的轻量级任务调度器!TaskScheduler!
  • 【18】Word:明华中学-儿童医保❗
  • 如何用selenium来链接并打开比特浏览器进行自动化操作(1)
  • 基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
  • 读spring官方文档的一些关键知识点介绍
  • 2024年AI与大数据技术趋势洞察:跨领域创新与社会变革
  • ThinkPhp项目解决静态资源请求的跨域问题的解决思路
  • mybatis的多对一、一对多的用法
  • 消息队列实战指南:三大MQ 与 Kafka 适用场景全解析