zoukankan      html  css  js  c++  java
  • 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开启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的转发了,好在成功了。

    http://my.oschina.net/u/1456860/blog/671866

  • 相关阅读:
    linux命令行
    mybatis中#{}和${}的区别
    @InitBinder的作用
    mui 实用封装销毁页面
    【SQLite】简单的基本使用步骤
    常用的一些操作方法
    【HttpWeb】Post和GET请求基本封装
    【接口验证】特性验证参数
    小谈单例模式
    vs下开端口直接调试iis
  • 原文地址:https://www.cnblogs.com/softidea/p/5651421.html
Copyright © 2011-2022 走看看