Angular4 去掉url中的#,并解决刷新时的404问题

解决Angular4项目部署到服务器上刷新404的问题 今天小编就为大家分享一篇解决Angular4项目部署到服务器上刷新404的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 立即下载
为什么要去除?
  1. Angular官方指出:如果没有足够使用hash风格(#)的理由,还是尽量使用HTML5模式的路由风格;
  2. 如果配置了hash风格,在微信支付或是Angular的深路径依然会出404的问题;
  3. 当你需要使用GA等工具时,由于无法获取#号后的URL,导致每次路由切换都给其发送一个路径;
  4. '#'有点丑。
怎样才能去除?

有四个方法:

  1. 前端 + ngx
  2. 前端 + Apache
  3. 前端 + Tomcat
  4. GithubPages / 码云 Pages + 404 页面
前端

index.html的head里加

<base href="/">

app.module.ts

import { ROUTER_CONFIG } from './app.routes.ts';
@NgModule({
   imports: [
    ...
    RouterModule.forRoot(ROUTER_CONFIG) 
   //  RouterModule.forRoot(ROUTER_CONFIG, { useHash: true } )   这样写是带#的
  ],  
})

app.routes.ts:

import { NgModule } from '@angular/core';
import { Routes } from '@angular/router';

export const ROUTER_CONFIG: Routes = [
  {
   ...
  }
];
如果只配置前端会怎么样?

如果只配置前端虽然会去掉’#'但是一刷新页面就404,路径解析上出错了。
Angular是单页应用,它实现了前端路由功能,后台可以不再控制路由的跳转,将原本属于后端的业务逻辑全部丢给前端。

用户刷新页面时(http://gitee.poetry/life),请求是先被提交到了WebServer后台,后台路由没有对应页面的路由管理,就会出现404的错误。

用户如果是先访问首页(http://gitee.poetry),然后再跳转到 页面(http://gitee.poetry/life),则这个跳转是由Angular前台管理的URL,访问是正常的。

那么我们让WebServer把属于Angular管理的路由URL,都转发到index.html就可以解决404的问题了,也就是后面介绍的配置信息。

思考:hash模式为什么不会404?

Nginx配置

带***的是需要自己配置 nginx.conf 文件内容

server {
    listen 80;  #监听的端口号 
    server_name  my_server_name; # 服务器名称  ***
    root   /projects/angular/myproject/dist;  #相对于nginx的位置 ***
    index index.html; #如果index.html存在,就结束查找过程,把这个文件附加到请求的request_uri后面,并且发起一个内部的redirect。

    location / {  # / 是匹配所有的uri后执行下面操作
        try_files $uri $uri/ /index.html; #try_files先寻找名为 $uri 文件,没有则寻找 $uri/ 文件,再没有就寻找/index.html
    }
}
try_files 详细解释:

如请求的是https://deepthan.gitee.io/poetry/life, $uri则是‘/life’,如果‘$uri’‘$uri/’都找不到,就会 fall back 到 try_files 的最后一个选项 /index.html发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到https://deepthan.gitee.io/poetry/index.html。这个请求会被 location ~ .php$ { … } catch 住,也就是进入 FastCGI 的处理程序。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 WordPress 程序的,因此不受 URI 变化的影响。

Apache

Apache的根目录新建一个.htaccess文件

RewriteEngine On  
# 如果请求的是现有资源,则按原样执行
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]  
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d  
RewriteRule ^ - [L]

# 如果请求的资源不存在,则使用index.html
RewriteRule ^ /index.html  
Tomcat配置

Tomcat/conf/web.xml文件上添加

<error-page>
    <error-code>404</error-code>
    <location>/</location>
</error-page>
GithubPages / 码云 Pages + 404 页面

对于github pages或码云 Pages来说,我们没办法直接配置Github pages,但可以在commit时添加一个404页。简单的解决方案如下:
我们在项目的根目录新建404.html,把index.html中的内容完全复制到404.html中就可以了。这样做github pages仍然会在恰当的时候给出一个404响应,浏览器将会正确处理该页,并正常加载我们的应用。

关于这方面的hack: S(GH)PA: The Single-Page App Hack for GitHub Pages

带‘#’和不带‘#’原理上有什么区别呢?
这个得先说下什么是前端路由:

以前路由都是后台做的,通过用户请求的url导航到具体的html页面,现在我们在前端可以利用 Angular、vue、react等通过配置文件,达到前端控制路由跳转的功能。
前端路由的实现方法:

  1. 通过hash实现
    当url的hash发生改变时,触发hashchange注册的回调(低版本没有hashchange事件,通过轮回检测url实现),回调中去进行不同的操作,进行不同的内容展示。
    使用hash来实现的话,URI规则中要带上#,路由中#后边的内容就是hash,我们常说的锚点严格来说应该是页面中的a[name]等元素。

  2. HTML5的history api操作浏览器的session history实现
    基于history实现的路由中不带#,就是原始的路由

Angular中的路由策略

angular2提供的路由策略也是基于上面两个原理实现的,可以在@NgModule中通过providers配置或RouterModule.forRoot()配置:
1) 路由中有#

@NgModule({
  imports:[RouterModule.forRoot(routes,{useHash:true})]
})

或

@NgModule({
  imports:[RouterModule.forRoot(routes)],
  providers:[
     {provide: LocationStrategy, useClass: HashLocationStrategy} 
  ]
})

HashLocationStragegy
适用于基于锚点标记的路径,比如/#/**,后端只需要配置一个根路由即可。

2) html5路由(无#)
改用 PathLocationStrategy(angular2的默认策略,也就是HTML5路由),使用这个路由的常规路径不带#,这种策略需要后台配置支持,因为我们的应用是单页面应用,如果后台没有正确的配置,当用户在浏览器从一个路由跳往另外一个路由或者刷新时就会返回404,需要在服务端里面覆盖所有的路由情况(后端可以通过nginx或者apache等配置)。

@NgModule({
  imports:[RouterModule.forRoot(routes)],
  providers:[
    {provide: LocationStrategy, useClass: PathLocationStrategy} 
    // 这一行是可选的,因为默认的LocationStrategy是PathLocationStrategy
  ]
})

更改index.html中的base href属性,Angular将通过这个属性来处理路由跳转

<base href="/app/">

在后端的服务器上,用下面的正则去匹配所有的页面请求导向index.html页面。

we must render the index.html file for any request coming with below pattern

index.html

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>My App</title>
  <base href="/app/">
  <body>
    <app-root>Loading...</app-root>
    <script type="text/javascript" src="vendor.bundle.js"></script>
    <script type="text/javascript" src="main.bundle.js"></script>
  </body>
</html>
前端路由优缺点

优点:
1.从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,然后服务器再响应请求,这个过程肯定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来说会有相当大的提升。
2.在某些场合中,用ajax请求,可以让页面无刷新,页面变了但Url没有变化,用户不能获取到想要的url地址,用前端路由做单页面网页就很好的解决了这个问题。

缺点:
使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存。

文章来源

作者:莫莫莫
链接:https://juejin.im/post/5a39c10351882538d3101129
来源:掘金

AD(AltiumDesigner)封装导入allegro生成allegro封装 AD(AltiumDesigner)封装导入allegro生成allegro封装 貌似PCB的封装问题是一个无尽话题,为了简单我总是想找捷径(主要还是太懒了),因为也是近期才开始学习使用allegro进行PCB设计,在最近的一个设计中,很多器件封装allegro中都没有,一个一个画感觉很费时间,但是在AD(AltiumDesigner)的封装库中是有的,于是便想着AD的封装库能不能倒入到alleg... 阅读详情

相关推荐

Unity序列帧动画输出全攻略:Recorder+Timeline实战与透明通道处理

序列帧动画是游戏开发、影视动画和UI动效中的基础技术,指将连续动作分解为一系列静态图像并按序播放,形成动态视觉效果。其原理是通过时间轴精确控制每一帧的内容与时机,实现动画的逐帧呈现。在实时渲染领域,序列帧输出技术价值显著,它能够将动态内容高质量地转换为静态图像序列,便于跨平台复用、后期合成与资源分发。应用场景广泛,包括角色动画导出、技能特效制作、宣传片素材生成等。本文聚焦Unity引擎,深入解析如何利用Recorder与Timeline工具链,高效输出带Alpha透明通道的PNG序列帧,并重点攻克透明通道处

weixin_31556767的博客 327

Angular2+去除url中的#

1. 为什么要去除? Angular官方指出:如果没有足够使用hash风格(#)的理由,还是尽量使用HTML5模式的路由风格; 如果配置了hash风格,在微信支付或是Angular的深路径依然会出404的问题; 当你需要使用GA等工具时,由于无法获取#号后的URL,导致每次路由切换都给其发送一个路径; '#'有点丑。 2. 怎样才能去除? 有四个方法: 前端 + ngx 前端...

weixin_33810006的博客 544

自研半导体Fab缺陷分析系统:从Klarf解析到Defect Map可视化的实战替代方案

本文分享了自研半导体Fab缺陷分析系统的实战经验,重点解析了Klarf文件格式与坐标系转换的核心技术,并详细介绍了从数据解析到Defect Map可视化的完整实现路径。该系统旨在为成本敏感或追求技术自主的团队提供一套功能完备的Klarity Defect平替方案,有效降低对昂贵商业软件的依赖,实现缺陷数据的自主分析与可视化。

y7z8a的博客 707

angular部署到iis出现404解决方案

angular应用部署在iis上,刷新出现404 解决方案: 安装 iis URL Rewrite 模块,并在 src 目录下增加web.config,配置urlrewrite如下: &lt;configuration&gt; &lt;system.webServer&gt; &lt;rewrite&gt; &lt;rules&gt; &lt;rule name="An...

weixin_34226706的博客 553

OpenSSH命令注入漏洞复现(CVE-2020-15778)

OpenSSH命令注入漏洞复现 1、简介 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现,ssh主要就是用来远程控制计算机,或传输文件,OpenSSH是使用SSH透过计算机网络加密通讯的实现。 2、漏洞概述 该漏洞是存在于scp在拷贝文件时产生的一个代码注入漏洞,攻击者可以利用此漏洞执行任意命令,比如:反弹shell, 3、影响版本 openssh <= openssh-8.3p1 4、实验环境 首先下载openssh,版本要符合漏洞影响的版本 服务端:apt-get

weixin_44537595的博客 3638

5分钟搞懂Paris公式:如何用裂纹扩展速率预测零件寿命(附Python代码示例)

本文详细介绍了Paris公式在裂纹扩展速率预测零件寿命中的应用,通过Python代码示例展示了从理论到实践的完整流程。文章涵盖了Paris公式的工程本质、寿命预测计算流程、几何修正因子选择以及实际案例演示,帮助工程师快速掌握这一关键技术。

weixin_29309475的博客 427

Angular项目部署到 ngnix服务器 刷新 404

一、angular默认路由 h5路由 将angular项目的  index.html 的标签修改为 &lt;base href="/myangular/"&gt; 重新编译部署 修改ngnix服务器的配置文件nginx.conf location /myangular { alias /html/myangular;#angular项目所在目录 ...

博客 1920

UE4打包为Framework库嵌入iOS原生工程

UE4打包为Framework库嵌入iOS原生工程

tangfuling1991的博客 1294

Angular/Vue 部署 IIS 刷新 404 的解决方案

在 Angular 或 Vue 部署到 IIS 上会遇到的问题,不能刷新,一刷新就会出现404,其原因就是自定义路由,下面我们来将这个问题解决。 1.从 IIS “获取新的 Web 平台组件” 2.进入 iis.net 官方网站去下载WebPlatformInstaller_x64_en-US.msi 扩展程序。整个安装过程只需要点 Install 即可,无需配置。 3.再次点击“...

研究、探索、分享与成长 1万+

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

huggingface高速下载模型的实战代码

本文主要介绍了huggingface高速下载模型的实战代码,尤其是无法通过国内源进行下载的huggingface模型,希望能对学习大模型的同学们有所帮助。需要特别说明的是,本文的代码是完全原创的,即能够最大限度利用宽度的速度,而且还能实现断点续传。 文章目录 1. 背景 2. 实战代码

herosunly的博客 29万+

发布服务器后的项目访问404,Angular 项目打包之后,部署到服务器,刷新访问404解决方法...

将前端代码打包部署到服务器中,当跳转到相应路由界面,刷新地址,服务找不到地址页面,所以会报 404 - Page Not Found。解决方法:只需要将路由转换成哈希值: userHash: true,将路由转化成“#”号的形式以下两种方式修改路由,使用hash:1、sys-routing.module.tsimports: [RouterModule.forRoot(routers, {us...

weixin_33277215的博客 810

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

Angular 去掉url中的#号,并解决页面刷新404问题

1. 为什么要去除?Angular官方指出:如果没有足够使用hash风格(#)的理由,还是尽量使用HTML5模式的路由风格;如果配置了hash风格,在微信支付或是Angular的深路径依然会出404的问题;当你需要使用GA等工具时,由于无法获取#号后的URL,导致每次路由切换都给其发送一个路径;'#'有点丑。2. 怎样才能去除?有四个方法:前端 + ngx前端 + Apache前端 + Tomca...

四分之一工程师的博客 9714

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Nginx+Tomcat部署Angular+javaweb项目(解决刷新404)

最近项目进入了即将验收阶段,项目部署是必不可少的。由于某些原因,我们把前端项目(Angular4)和后端项目(JavaWeb),由于要部署了四个项目:Angular4(微信端),微信端数据服务,JavaWeb(PC端)*2,并且是放在同一个服务器下。Java项目比较好部署,Tomcat/Jetty都可以轻松部署好。但是Angular部署起来不是那么的容易(当然是对于我这种菜鸟而言),我先说下为什么我

微雨燕凝霜寒 4828

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Angular4项目部署到服务器上刷新404解决办法

刚遇到Angular4项目npm run build 后部署到服务器可以访问,但是刷新页面会出现404的错误!在网上搜了一下看到有些人写的解决办法还有错误在里面,一眼看就知道的错误,感觉这些人真的有毛病,决定写了博客,为什么那么不仔细,写错误的上去,祸害别人吗!! 解决angular2页面刷新后报404错误办法: 配置app.module.ts import {HashLoc

请叫我神的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

angular去掉地址栏#号

AngularJS框架提供了一种HTML5模式的路由,可以直接去掉#号。通过设置$locationProvider.html5Mode(true)就行了。 1.添加base标签 html lang="zh-CN" ng-app="app"> head> base href="/"> //增加base标签 // 省略代码 head> 2.编辑app.js,增加 $

Blog_BC的博客 3959

Angular2+URL中的 # 引发的思考

1.先分析 # 的作用 1.1. # 的涵义 #代表网页中的位置。其右面的字符就是该位置的标识符。比如,http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。 #是指导浏览器动作的,对服务器完全无效。所以HTTP请求不会包含#及右侧内容 ...

576

angular 去掉url里面的#

1.适合客户端的方法,但是页面不能刷新,一刷新就404 (1)在index.html里添加 <base href="/"> (2)在app.js的config里,注入$locationProvider...

qq_45670012的博客 308

Angular2+ 编译后部署到服务器上页面刷新404问题

原因:NG2+ 会默认不显示URL后面的文件名 解决方案:使用LocationStrategy方式,然后把URL后的# 替换成index.html# app.module.ts 1 import {HashLocationStrategy , LocationStrategy} from '@angular/common'; 2 3 @NgModule({ 4 ...

246

SPA部署Nginx刷新404问题:从原理到实战的完整解决方案

单页应用(SPA)是现代前端开发的主流架构模式,它通过客户端路由实现页面无刷新切换,提升了用户体验。其核心原理是利用前端路由库(如Vue Router、React Router)在浏览器端管理URL与组件映射,而服务器仅提供静态资源。然而,当SPA部署到Nginx等静态服务器时,刷新非根路径页面常出现404错误,这是因为服务器试图寻找对应物理文件而非返回入口文件。解决这一问题的技术关键在于配置Nginx的try_files指令,将未匹配的请求回退到index.html,让前端路由接管。这一方案不仅解决了部署

weixin_34239169的博客 534

Angular部署GitHub Pages:base-href与ngh路由兜底全解

单页应用(SPA)依赖客户端路由,但静态托管平台如GitHub Pages默认按物理路径匹配文件,导致刷新子路由返回404。其本质是前端路由机制与服务端无状态响应之间的不兼容问题。解决该问题需从资源定位和请求兜底两层入手:`--base-href` 确保JS/CSS/路由基准路径正确,避免白屏;`angular-cli-ghpages`(ngh)则利用GitHub Pages的404.html劫持机制,注入重定向逻辑,使任意路径均回退至index.html交由Angular Router接管。该方案适用于所

weixin_34326429的博客 426

从零自制电调:AM32与VESC方案硬件设计、固件烧录与调试全攻略

无刷电机驱动是现代机器人和电动载具的核心技术,其本质是通过功率MOS管和栅极驱动电路,将直流电转换为三相交流电,实现电机的精确换相与调速。在FPV穿越机、电动滑板等场景中,电调需要在毫秒级响应油门变化,并承受数十安培的瞬时电流。开源固件AM32和VESC分别代表了两种技术路线:前者基于AT32F421等MCU,采用六步换相算法,主打小体积与快速响应;后者集成FOC算法,支持CAN总线通信,适用于高精度转矩控制。自制电调涉及原理图设计、PCB布局、固件烧录及参数调优,是深入理解电机控制与电力电子的绝佳实践。

weixin_33923762的博客 322

umi 打包发布IIs刷新报404的解决方案

https://www.cnblogs.com/YahuiWang/p/React-Router-browserHistory-IIS.html

黄正梦的博客 3298
上一篇: MockMvc详解
下一篇: MockMVC测试Controller中常见的请求方式
占位符号
博客等级 码龄10年 75粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值