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

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 , re

class 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 = MyHttpRequestHandler

PORT = 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.kler.cn/a/508139.html

相关文章:

  • win32汇编环境,窗口程序中基础列表框的应用举例
  • Perl语言的数据库编程
  • 【Flink系列】6. Flink中的时间和窗口
  • AWTK fscript 中的 输入/出流 扩展函数
  • 使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))
  • C++实现设计模式---外观模式 (Facade)
  • LeetCode 3097.或值至少为 K 的最短子数组 II:滑动窗口
  • 3.数据库系统
  • 面试题解析
  • 电子应用设计方案93:智能AI电火锅系统设计
  • MS5263数模转换器可兼容AD5663/DAC8552
  • 芝麻http/品易http/太阳http/极光http退市后,还有哪家好用推荐?
  • 嵌入式驱动开发详解12(LCD驱动)
  • 我在讯方智汇云校备考云计算HCIE的经验分享
  • window下用vim
  • Python大数据可视化:基于Python对B站热门视频的数据分析与研究_flask+hive+spider
  • 协作机器人公司切入人形机器人赛道,大有可为!
  • 【Mac】MacOS如何显示隐藏的文件或文件夹
  • 骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程
  • “人工智能+技校”:VR虚拟仿真实训室的发展前景
  • 基于机器学习随机森林算法的个人职业预测研究
  • 今日总结 2025-01-14
  • win32汇编环境,窗口程序中基础列表框的应用举例
  • 《在ArkTS中实现模型的可视化调试和监控:探索与实践》
  • 【环境安装】安装LLaMA-Factory
  • 获取手机验证码登录的完整流程