首页 > 其他分享 >angularJS友好URL实现 good

angularJS友好URL实现 good

时间:2023-01-02 17:31:08浏览次数:57  
标签:good http URL app 127.0 0.1 locationProvider html angularJS

nginx部署 angularjs时的rewrite问题

使用h5+angularjs完成了一个项目 此项目在正式环境上使用nginx做webserver

此项目的入口在微信/微博分享中 由于分享时的项目访问地址中含有’#‘(类似:test.com/#/goods) ’#‘的位置会被微博微信所修改 导致分享后的地址无法正常访问

所以分享时要去掉地址中的’#‘ 也就是分享的链接是:test.com/goods

但是项目入口时如果没有#也会异常 此时是否可以通过nginx rewrite test.com/goods 到 test.com/#/goods 这里如何写rewrite

在此请教nginx高手

可以考虑使用 html5 里的 pushState 来去掉 # 号。 在 config 方法里注入 $locationProvider, 然后设置​​$locationProvider.html5Mode(true)​​​。参见​​http://docs.angularjs.cn/api/ng/provider/​​$locationProvider nginx 的话应该可以这样

rewrite ^/(.*)$ http://test.com/#/$1 redirect;

用 302 跳转来改变 url,没有亲测,可以试下看看

​ http://www.thinksaas.cn/ask/question/16418/​

nginx如何将http://localhost/api/getuser rewrite为http://localhost/product/api/getuser

301/302重定向;

方法一:

rewrite /product/(.*) /$1;
rewrite /(.*) /product/$1;

方法二:

if ($uri ~ ^/product) {
rewrite /(.*) /product/$1;
}

​http://cnodejs.org/topic/52a6b55ba6957a080985e881​

摘要

angularJS开启html5 mode需要配合服务端来解决刷新404的问题,Nginx和Express实现起来比较简单,tomcat略复杂一点。

AngularJS框架定义了自己的前端路由控制器,通过不同URL实现单面(ng-app)对视图(ng-view)的部署刷新,并支持HTML5的历史记录功能。对于默认的情况,是不启动HTML5模式的,URL中会包括一个#号,用来区别是AngularJS管理的路径还是WebServer管理的路径。 比如:下面的带#号的URL,是AngularJS管理的路径。​​http://127.0.0.1/​​​ ​​http://127.0.0.1/#/​​​ ​​http://127.0.0.1/#/login​​​ ​​http://127.0.0.1/#/case/34​​ 这种体验其实是不太友好的,URL中含义“#”,看着特别不爽。AngularJS框架提供了一种HTML5模式的路由,可以直接去掉#号。通过设置$locationProvider.html5Mode(true)就行了。

app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {

//..省略代码
$locationProvider.html5Mode(true);
}]);

开启后,URL变化为: ​​http://127.0.0.1/​​​ ​​http://127.0.0.1/login​​​ ​​http://127.0.0.1/case/34​​​ 当然事情不会这么简单,当用这种方式设置了路径以后。如果用户从首页(​​http://127.0.0.1/)开始访问,然后跳转到登录页面http://127.0.0.1/login)一切正常。但如果用户直接打开​​​ 图书页(​​http://127.0.0.1/login​​) ,就会出现404错误。问题很奇怪,在没有找到解决办法前还是忍气吞声的关闭了HTML5模式,讨厌的#又出现在URL中。 经过查阅资料,之所以404其实WebServer抢先接管了AngularJS的路由,我们的SPA应用基于MVC模型,在地址的目录确实没有这个路径,这次重构的KITE,实际上连VIEW视图都集成在了JS中,所以出现404那是理所当然了。那有解决办法没有?有,我们让WebServer把属于AngularJS管理的路由URL,都发转到ng-app就可以解决404的问题了,同时,没有#号,还支持HTML5的历史记录查询。这里因为我们的APP都是前后端分离,前端是纯静态的,动态网站没有实践,这里就只分享静态网站去掉#的方法。 静态网站,我们需要修改的地方包括3个文件 index.html : ng-app的定义文件 app.js : 对应ng-app的控制文件 以及WebServer地址转发的文件,因为启server的工具很多,正好我也试过几种方法,后面详细讲。 1.编辑 index.html,增加base标签。

<html lang="zh-CN" ng-app="app">
<head>
<base href="/"> //增加base标签

// 省略代码
</head>

2.编辑app.js,增加 $locationProvider.html5Mode(true);

app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'src/login/login.html',
controller: 'loginCtrl'
});
$locationProvider.html5Mode(true);
}]);

3.WebServer地址转发

tomcat

这里需要使用到​​UrlRewriteFilter​​​这个插件,使用方法: 1.将​​urlrewritefilter-4.0.3.jar​​包放入应用目录“WEB-INF/lib”下。 2.在WEB-INF/web.xml配置文件中加入:

<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

3.在WEB-INF目录新建“urlrewrite.xml”转发规则文件。内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
<rule>
<from>^/[a-zA-Z]+(/([a-zA-Z]|[0-9])*)*$</from>
<to>/index.html</to>
</rule>
</urlrewrite>

其中rule部分匹配地址用到了正则表达式,这里不赘述。这样就将规则设置完成了,重启tomcat刷新页面,没有#也不会404了。

Nginx

Nginx用到的是try_files,修改nginx的配置文件,增加try_files配置。

server {
server_name localhost;
root /www;
location / {
try_files $uri $uri/ /index.html;
}
}

其中root的目录,对应ng-app的定义文件html的目录

Apache

<VirtualHost *:80>
ServerName localhost

DocumentRoot /www

<Directory /www>
RewriteEngine on

# Don't rewrite files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Rewrite everything else to index.html to allow html5 state links
RewriteRule ^ index.html [L]
</Directory>
</VirtualHost>

IIS

<system.webServer>
<rewrite>
<rules>
<rule name="Main Rule" stopProcessing="true">
<match url=".*" ></match>
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" ></add>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" ></add>
</conditions>
<action type="Rewrite" url="/" ></action>
</rule>
</rules>
</rewrite>
</system.webServer>

Express

var express = require('express');
var app = express();
app.all('/*', function(req, res, next) {
// Just send the index.html for other files to support HTML5Mode
res.sendFile('index.html', { root: __dirname });
});

app.listen(8080); //the port you want to use

综上,Express,Nginx,tomcat方法我都试过,本地开发是用的Express启的server,公司的测试环境和Nginx在一个服务器上,所以在测试环境上还行的通,但是正式环境应用服务器和Nginx服务器是分开的,显然root没法设置了,只好琢磨tomcat的转发了,好在成功了。

标签:good,http,URL,app,127.0,0.1,locationProvider,html,angularJS
From: https://blog.51cto.com/u_15147537/5983899

相关文章

  • 获取微信支付码url
    (1)获取微信支付码url主方法///<summary>///获取微信支付二维码///</summary>///<paramname="log">日志</param>///......
  • Apache和Nginx设置伪静态(URL Rewrite)的方法
    在Apache中有两种方法配置,一是通过httpd.conf文件,二是通过.htaccess文件。 使用httpd.conf来配置rewrite策略。 要使用httpd.conf文件来设置伪静态策略,我们可以......
  • curl命令常见用法汇总 good
     ​​curl​​是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服......
  • Java中动态代理技术生成的类与原始类的区别 (good)
    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类......
  • GIT推送错误error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CAN
    报错如下:Countingobjects:100%(25515/25515),done.Deltacompressionusingupto4threadsCompressingobjects:100%(18794/18794),done.error:RPCfailed;......
  • 流畅的Flurl.Http
    注意:除了URL构建和解析之外的所有内容都需要安装Flurl.Http而不是基本的Flurl包。考虑与HTTP服务交互的一种非常常见的方式是“我想构建一个URL,然后调用它”。Flurl.......
  • Good Bye 2021: 2022 is NEAR D
    D.KeeptheAverageHigh题链又是任何一个任意正整数z,2x+3y=z有整数解。namo对于一个区间和为负数这个区间肯定可以又一些个长度为2长度为3的小区间构成要是我们......
  • buuctf URL解密 摩丝
    URL编码/解码详解当URL路径或者查询参数中,带有中文或者特殊字符的时候,就需要对URL进行编码(采用十六进制编码格式)。URL编码的原则是使用安全字符去表示那些不安全的字......
  • Good Bye 2022: 2023 is NEAR
    题目链接A核心思路:其实就是考察一个muliset的应用,这个和set的区别是它可以储存重复的元素。然后需要注意题目啊,必须得进行m次操作.#include<iostream>#include<set>#i......
  • Goodbye 2022!!!!
    碌碌无为的一年。苍白的一年。没有什么令人欣喜的成果,也没有什么脚踏实地的进步。倒是目睹了勇士王朝再续辉煌,学长们纷纷成功,阿根廷又一位球王登基。也在混乱的疫情时代......