是否有任何方法在服务器端不使用url重写删除角度应用程序的URL?

时间:2017-06-19 10:43:48

标签: angularjs iis-7 angular-ui-router

我看到的例子解释说我们可以通过改写角度应用程序URL。

放置

<base href="/">

然后在路线

  

$ locationProvider.html5Mode({                             启用:true                        });

并删除了#,但是当我刷新页面时,它说找不到页面。

所以下一步是通过node.js,iis或服务器端技术重新编写服务器端的URL来解决这个问题。

http://jasonwatmore.com/post/2016/07/26/angularjs-enable-html5-mode-page-refresh-without-404-errors-in-nodejs-and-iis

有没有使用服务器的方法我只能在角度端进行吗?

2 个答案:

答案 0 :(得分:2)

问题的答案是:否。

AngularJS文档明确指出HTML5模式需要重写URL。

来自文档:

  

HTML5模式

     

服务器端

     

使用此模式需要在服务器端重写URL ,基本上您必须重写所有指向应用程序入口点的链接(例如index.html)。要求<base>标签对于这种情况也很重要,因为它允许AngularJS区分作为应用程序库的url部分和应用程序应该处理的路径。

     

— AngularJS Developer Guide - Using $location (HTML5 Mode Server Side)

对于在NodeJS和ExpressJS

下运行的角度应用程序
var express = require('express');
var path = require('path');
var router = express.Router();

// serve angular front end files from root path
router.use('/', express.static('app', { redirect: false }));

// rewrite virtual urls to angular app to enable refreshing of internal pages
router.get('*', function (req, res, next) {
    res.sendFile(path.resolve('app/index.html'));
});

module.exports = router;

对于在Windows上的IIS下运行的角度应用程序

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

答案 1 :(得分:0)

是的,我在处理IIS和URL重写方面遇到了很多问题,最终决定只在我的应用程序中处理它们。

在我的global.asax文件中 - 这是在vb中 - 我添加了:

Private Const ROOT_DOCUMENT As String = "~/client/index.html"

然后我补充道:

 Protected Sub Application_BeginRequest(sender As [Object], e As EventArgs)
    Dim url As String = Request.Url.LocalPath
    If Not System.IO.File.Exists(Context.Server.MapPath(url)) And Not (url.IndexOf("/odata/") >= 0 Or url.IndexOf("/api/") >= 0) Then
        Context.RewritePath(ROOT_DOCUMENT)
    End If
 End Sub

所以基本上,如果URL没有映射到文件而且它不是对我的数据存储或API的调用,我只是让Angular在客户端处理它。它运作得很好。