[angularjs]解決spa使用html5網址,重整後會找不到頁面的問題

前言

此解決方案是處理了本地開發,還有iis上面的設定,在專案裡面,我使用的是BrowserSync and Gulp的方式。

文章導覽

 

如何讓angularjs的spa路由變成html5模式

在此我使用的是ng-router,首先在routerConfig注入$locationProvider

(function() {
  'use strict';

  angular.module('app')
    .config(ngRouteConfig);

  function ngRouteConfig($routeProvider, $locationProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'controller/home/home.index.html',
        controller: 'homeController as vm',
        resolve: {
          viewModel: function(homeInnerService) {
            return homeInnerService.getIndex();
          }
        }
      })
      .otherwise({
        redirectTo: '/'
      });

    //下面這一行可啟用html5的url模式
    $locationProvider.html5Mode(true);
  }

})();

接著在spa入口的html的header裡面加入下面這一行,在我的專案裡面,是命名為index.html

<base href="/app">

好吧,一切都看起來很簡單,連angular2都是一樣的設定方式,接下來我們的坑就來了,我們在本機或者是佈上正式環境(筆者這邊是iis),只要一按重整,畫面就會顯示找不到頁面。

BrowserSync and Gulp的解決方法

首先需要先安裝connect-history-api-fallback,直接下語法安裝回來

npm install connect-history-api-fallback --save-dev

先在gulpfile.js的最上面引用connect-history-api-fallback

historyApiFallback = require('connect-history-api-fallback')


在開啟server的部份,改成如下的語法

browserSync({
    server: {
      baseDir: './dev',
      middleware: [historyApiFallback()]
    }
  });

done,本地開發已經ok了,按了重整一切都會正常

IIS相關設定

首先得安裝URL Rewrite,可從此位置下載安裝,或者是直接從iis上面安裝,如下圖示

安裝完之後,再專案底下的web.config加入以下語法

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Vue Spa" stopProcessing="true">
                    <match url=".*" />
                    <action type="Rewrite" url="/" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{PATH_INFO}" pattern="api/.*" negate="true" />
                    </conditions>
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

done,that is fine

if you have any idea or suggest.please replay me.