Angular2+如何去除url中的#

最近,接到反馈说百度统计无法对#号后的URL进行分析,需要前端这边去掉URL中的#,下面我分享一下这个问题的处理过程。

1、Angular2+ 路由策略

1.1 HashLocationStragegy

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

http://121.201.95.249/#/home

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

1.2 PathLocationStrategy

通过history实现,angular2的默认策略,也就是HTML5路由,使用这个路由的常规路径就是/concat,/about,不带#。url格式如下:

http:// 121.201.95.249/home

这种策略需要后台配置支持,因为我们的应用是单页面应用,如果后台没有正确的配置,当用户在浏览器从http: // 121.201.95.249/concat跳转到http: // 121.201.95.249/about或者刷新时就会返回404,需要在服务端里面覆盖所有的路由情况(后端可以通过nginx或者apache等配置)。

2、如何去除

主要分两部分,前端路由策略模式修改,以及后端服务器配置。我的项目中后端服务器用的是Apache,下面我将以这个为例子进行解析。

2.1 前端修改

index.html文件:
在head里设置base-href,如果没有设置,当通过“深链接”进入该应用时,浏览器就不能正确的加载网站资源(图片、CSS、脚本)。如下:

<base href="/">

base-href,主要是设置你的项目访问的根目录,如果你的项目是放在服务器某一文件夹里面的,比如通过http: // 121.201.95.249/myApp/home才访问到你的项目,那么根目录设置如下:

<base href="/myApp/">

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

app.routes.ts文件:
import { NgModule } from '@angular/core';
import { Routes } from '@angular/router';
export const routes: Routes = [
 {
 ...
 }
];

设置到这里便可以实现去掉“#”跳转了,但是每次刷新或者直接输链接进到页面时会报错提示:404找不到页面。因此,我们需要后端配合做路由重定向。

2.2 后端服务器配置

Apache配置文件修改:


RewriteEngine On
# 如果请求的是现有资源,则按原样执行
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# 如果请求的资源不存在,则使用index.html
RewriteRule ^ /index.html

Apache Rewrite配置就是用来设置重定向的,上面5行(不包括#的注释内容)配置内容的意思是:

第一行: 将RewriteEngine引擎设置为on,就是让url重写生效,用于开启rewrite功能;
第二行: RewriteCond是指令定义了一个规则的条件,即在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则(RewirteRule)仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。上面的匹配规则意思是,如果文件存在,就直接访问文件,执行第四行重写规则(RewirteRule)停止分析,否则执行第三行
第三行: 如果目录存在就直接访问目录,然后执行第四行重写规则(RewirteRule)停止分析
第四行: 表明当前规则是最后一条规则,停止分析后面的规则
第五行: 意思是把请求发送到index.html;当第二第三条规则都不满足的时候,就不执行第四行的RewriteRule,直接执行第五行的RewriteRule,把请求发送到index.html,实现重定向

想对规则进行更多了解,请查看这篇文章(https://www.jb51.net/article/82158.htm) ,下面我说一下Apache的配置步骤。
大家如果是在集成环境比如uwamp,wamp或者Apache1可以打开配置文件httpd.conf,如果是Apache2则打开配置文件/etc/apache2/apache2.conf,进行修改。
(1) 引入重写rewrite模块
如果是集成环境或者Apache1,找到#LoadModule rewrite_module modules/mod_rewrite.so,去掉前面的”#”:

LoadModule rewrite_module modules/mod_rewrite.so

如果是Apache2的话,执行命令加载Rewrite模块:

a2enmod rewrite

执行后,会提示OK和重启Apache命令(/etc/init.d/apache2 restart)。

(2)添加配置规则

<VirtualHost *:80>
    ServerName myApp
    DocumentRoot /www/myApp
    <Directory /www/myApp>
        RewriteEngine on
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
        RewriteRule ^ - [L]
        RewriteRule ^ index.html [L]
    </Directory>
</VirtualHost>

这里的“/www/myApp”是存放项目的根目录路径。

可能前端的同学使用集成环境的比较多,如果不能完全理解的话,我拿uwamp环境做例子解析一下。
index.html文件:

<base href="/dist">

项目打包到dist文件中,然后把dist文件内容放到www下面,也就是www/dist里面就是打包后的内容index.html以及各种js包,然后打开配置文件httpd.conf:

引入重写rewrite模块,找到#LoadModule rewrite_module modules/mod_rewrite.so,去掉前面的”#”:

添加规则:

<VirtualHost *:80>
    DocumentRoot "{DOCUMENTPATH}/"
    <Directory "{DOCUMENTPATH}/dist">
        Options FollowSymLinks
        AllowOverride All
        RewriteEngine On
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
        RewriteRule ^ - [L]
        RewriteRule ^ index.html
    </Directory>
</VirtualHost>

(3)重启Apache
Apache1重启

# service httpd restart

Apache2的重启:

# /etc/init.d/apache2 restart

或者

# service apache2 restart 

uwamp环境的重启,打开uwamp界面,先点击关闭,然后再开启即可:

(4)刷新页面,会发现不再是404报错了,设置成功。设置过程中需要留意的几个坑是:

  • 没有设置base-href,或者设置错误
  • Rewrite模块没有引入
  • 忘记重启Apache

原文地址:https://www.cnblogs.com/huiguo/p/10441077.html

时间: 2024-08-29 06:57:21

Angular2+如何去除url中的#的相关文章

去除url中自带的jsessionid

web.xml中配置Filter: ? 1 2 3 4 5 6 7 8 9 10 11 <filter>    <filter-name>jsessionid</filter-name>    <filter-class>     cn.iautos.mall.filter.RemoveUrlSessionFilter    </filter-class> </filter> <filter-mapping>    <

LNMP一键安装包+Thinkphp搭建基于pathinfo模式的路由(可以去除url中的.php)

LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat/Fedora.Debian/Ubuntu/Raspbian/Deepin VPS或独立主机安装LNMP(Nginx/MySQL/PHP).LNMPA(Nginx/MySQL/PHP/Apache).LAMP(Apache/MySQL/PHP)生产环境的Shell程序.同时提供一些实用的辅助工具如:虚拟主机管理.FTP用户管理.Nginx.MySQL/MariaDB.PHP的升级.常用缓存组件Redis.Xca

wordpress如何去除URL中的category

WordPress网站url一般默认有Category,既不利于优化也不利于用户体验,如何去除,韶关SEO博客推荐2种比较简单的方法. 第一种:更改固定链接. 1.登录wordpress后台,点击设置里面的固定连接. 2.在"可选"下的"分类目录前缀"框中填写英文的".",保存更改后,就能去掉Category了. 3.上面步骤完成后页面还是无法打开或出现404错误,可能是与你做的固定链接设置中常用设置有关,如果出现这个情况只需要在自定义结构里面加

LAMP集成环境去除url中的index.php

EyouCms(易优CMS)在不同环境会出现不同问题,有些自动去除了index.php进行重写,有些url中还带着小尾巴index.php,看着很是不爽,今天就遇到一个用户在使用EyouCms时反馈了这个问题,下面是如何去掉index.php,以LAMP集成环境为例,其他环境会默认自动开启,不支持的可以先看一块URL重写扩展. 如图所示:只要点击勾选apache的rewrite_module模块就OK,如果没自动重启,那就还得重启服务器哦! 原文地址:易优CMS 原文地址:http://blog

ThinkPHP去除url中的index.php

例如你的原路径是 http://localhost/app/index.php/module/action/var/value/那么现在的地址是 http://localhost/app/module/action/var/value/ 去除index.php 1.httpd.conf配置文件中加载了mod_rewrite.so模块  //在APACHE里面去配置 #LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉 2.AllowO

阿里云url解析,发布web后去除url中的端口号

归根结底就是80端口的使用,不是http的80 的 或 https的443  都得加端口号 [问题描述] http://wisecores.wisers.com:8080/JsonProject/servlet/JsonServlet?action_flag=person 如上,如果发布出去,不可能挂个":8080"在url上. 1.以windows下的tomcat来测试 丢两个web项目进去 2.server.xml配置如下 1 <Host name="wisecor

Laravel5.5去除URL中的index.php生成优雅链接

在使用Apache情况下: Laravel 框架通过 public/.htaccess 文件来让网址中不需要 index.php.如果你的服务器是使用 Apache ,请确认是否有开启 mod_rewrite 模块. 假设 Laravel 附带的 .htaccess 文件在 Apache 无法生效的话,请尝试下面的方法: <IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </If

weblogic.xml 配置去除url中session

<session-descriptor> <url-rewriting-enabled>false</url-rewriting-enabled> </session-descriptor> 原文地址:https://www.cnblogs.com/molecule/p/9270038.html

Joomla的Url中去除index.php

最近在研究Joomla系统(一个著名的CMS系统),安装之后发现页面的URL中始终有一个index.php存在,感觉非常碍眼,决心将其除之而后快,废话少说,下面以2.5版本为例奉上去除步骤. 1. 登录管理后台,在"Site"->"Global Configuration"->"Site"中的"SEO Settings"中全部勾选"Yes": 2. 创建.htaccess文件:将Joomla安装