用angular2-cli打包项目之后,跳转路由刷新会报404的错误

发布于 2022-09-05 22:54:06 字数 626 浏览 17 评论 0

Aangular2项目用anguar2-cli下的ng build命令打包项目之后,运行dist文件夹中的静态index.html文件,第一次路由跳转没有问题,但是在跳转的路由中刷新页面的话,会返回404的错误。

GitHub代码链接:https://github.com/borysn/spr...

clipboard.png

在主页面点击register 之后会正常跳转到注册页面,但是在注册页面下刷新的话,会返回404

clipboard.png

不知道有没有其他人遇到过这种情况,有的话还烦请告知下解决办法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

少女的英雄梦 2022-09-12 22:54:06

在路由中添加{useHash:true}可以解决这个问题

半世晨晓 2022-09-12 22:54:06

同问,我也在找这个问题

可爱咩 2022-09-12 22:54:06

可以借助于 Nginx 做一层路由中转,先跳到首页,再利用路由策略再进行相关渲染

━╋う一瞬間旳綻放 2022-09-12 22:54:06

路由是否设置了动态参数,如果设置了的话,是有可能出现这个问题,我也正在解决中

葬心 2022-09-12 22:54:06

这个原因是,页面刷新后重新发起了http请求。解决方案是后端做一次重定向即可。这个是我的解决方案

Angular2中支持两种路由模式,LocationStrategy 和 HashLocationStrategy。LocationStrategy 采用Html5中的history.pushState
实现。这是一种改变URL地址却发送HTTP请求的技术,非常的赞。可以参考以下文章了解:

<!--more-->

https://www.renfei.org/blog/html5-introduction-3-history-api.html

LocationStrategy 路由形如:http://localhost/home/index

HashLocationStrateg 路由形如:http://localhost/#/home/index

如果采用默认的LocationStrategy,项目打包发布到服务器端以后。当用户访问http://localhost/home/index并刷新页面时,会产生一个HTTP请求,导致当前请求绕过前端路由,访问服务器端资源。如果服务器没有做相应处理。会导致404或者其他错误。

解决方案:

通过配置Apache模块重写(mod_rewrite)重定向到前端路由。

假设,我们所有的前端请求放置在服务器根目录下的public下。我们把public作为前端发布地址。正确的访问姿势是这样:

http://a.com/public。前端的入口是:http://a.com/public/index.html

如果带前端路由(LocationStrategy方式),应该是这样子:
http://a.com/public/home/index,注意,这里的前端路由仅仅是 home/index。如果页面刷新,请求会发送到服务器端,错误一个正常的HTTP请求。此时,可通过模块重写重定向到前端路由。以下是我的 .htaccess文件的写法,仅作为参考。要实现重写,请参考apache2 mod_rewite规则。


RewriteEngine on

# 执行前端路由
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|jpeg|png|css|xml|swf|txt|woff|ttf|eot|svg|otf|map)$
RewriteRule ^(public)(.*)$ public/index.html [L]

# 执行后端路由
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|jpeg|png|css|xml|swf|txt|woff|ttf|eot|svg|otf|map)$
RewriteRule ^(.*)$ index.php/$1 [L]

规则简单解释(其实我对模块重写规则不是特别了解):

  1. RewriteEngine on 开启模块重写。前提是httpd.conf已经配置OK。

  2. RewriteCond %{REQUEST_FILENAME} !-f 当请求一个存在的文件时,不做规则重写。

  3. RewriteCond %{REQUEST_FILENAME} !-d 当请求一个存在的目录时,不做规则重写。

  4. RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|jpeg|png|css|xml|swf|txt|woff|ttf|eot|svg|otf|map)$ 当请求中存在这些文件后缀(通常是资源文件),不做规则重写。

  5. RewriteRule ^(public)(.*)$ public/index.html [L] 当满足 public开头的请求时,重定向到public/index.html。规则末尾的[L] 表示这是最后一条独立的规则。主要是避免对后面的规则产生影响,可以理解为一个IF语句的结束。

  6. RewriteRule ^(.*)$ index.php/$1 [L] 实现后端(PHP)隐藏index.php这个入口文件。

百思不得你姐 2022-09-12 22:54:06

看了没有想要的答案,因为我们这边要走负载所以问题更严重,最后走了个取巧的方法替换url地址,代码如下!

  changeURL() {
    var text = window.location.href;
    text.toString();
    var url = text.replace(/#/, "index.html#");
    window.history.pushState({}, "0", url);
  }
  ngOnInit() {
    this.changeURL();
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文