angularJS友好URL实现 good
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框架定义了自己的前端路由控制器,通过不同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的转发了,好在成功了。
http://my.oschina.net/u/1456860/blog/671866
angularJS友好URL实现 good的更多相关文章
- angularjs中URL中的#号问题,$locationProvider.html5Mode(true)刷新404
解决办法原文地址:https://blog.csdn.net/weixin_36185028/article/details/72179568 angularjs支持两种url模式,hash模式和ht ...
- AngularJs中url参数的获取
前言: angular获取通过链接形式访问的页面,要获取url中的参数,就不能通过路由的方式传递获取了,使用原生js或者jquery,又显得比较麻烦,好在angular已经封装了获取url参数的方法, ...
- URL重写 urlrouting
在global文件中添加以下的代码 <%@ Import Namespace="System.Web.Routing" %> <script RunAt=&quo ...
- Angularjs路由需要了解的那点事
Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...
- angularjs笔记(三)
AngularJS API 7.其他一些常用指令,布尔类型的指令也可以用表达式 (1).数组索引$index <!DOCTYPE html> <html> <head&g ...
- ThinkPHP的四种URL模式 URL_MODEL
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式.PATHINFO.REWRITE和兼容模式. 普通模式 设置URL_MODEL 为0 采用传统的URL参数模 ...
- AngularJS进阶学习
参考:http://***/class/54f3ba65e564e50cfccbad4b 1. AJAX:Asynchronous JavaScript and XML(异步的 JavaScript ...
- [AngularJS] Introduction to ui-router
Introduce to basic $stateProvider.state() with $stateParams services. Understand how nested router w ...
- ThinkPHP URL模式和URL重写
现在用的版本是TP3.1.3,这两天总是遇到NotFound的错误,解析路径错误,所以认真研究了一下手册,发现问题出在URL模式上面. URL模式 一般是使用U方法来生成路径,U方法的定义规则如下(方 ...
随机推荐
- openssl命令行Base64编解码
openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...
- uploadify 使用 详细 说明
简单 常用的 时间 有点 紧 先写 这点 , 有时间 在更新 下面有 例子 链接 不过要 自己 摘 一下 很简单的啦 <script type="text/javascrip ...
- 【Cocos2D-x 3.5实战】坦克大战(1)环境配置
前言: 最近课比较少,空闲时间比较多,一有时间就东想西想,想着想着就突然想到做手机游戏(android)了,学习下CoCos2d.看了一些CoCos2D的相关文档和教程,觉得是时候实战了,但是苦于没有 ...
- dubbo架构演变之路
背景 (#) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...
- mysql中随机取出几条数据
SELECT t1.id,title,extName,cover,url FROM shop_articles AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT M ...
- HDU2007-平方和与立方和
描述: 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. 代码: #include<stdio.h> #include<string.h> #include ...
- canvas绘制弹跳小球
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ...
- centos7 install magento
http://mirrors.yun-idc.com/epel/7/x86_64/e/epel-release-7-2.noarch.rpmrpm --import /etc/pki/rpm-gpg/ ...
- step_by_step_G+入门-在线服务
第一步:先大概介绍下我们的窗体的布局框架,窗体大体分为以下3大块: 顶部:也就是大的模块划分(比如首页,软件管家,在线服务等) 内容区域:根据选择的不同的顶部模块,进行不同的内容展示: 底部:设置,下 ...