是否有任何方法可以删除 angular 应用程序的 url 的 # 而无需在服务器端使用 url 重写?

Is there is any method to remove # for url of angular application without using url rewrite in server side?

我看到示例说明我们可以通过 .

重写 angular 应用程序 url

放置

<base href="/">

然后在路线

$locationProvider.html5Mode({ enabled: 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

有没有不使用服务器的方法我只能在angular端完成?

是的,我在处理 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 在客户端。效果很好。

问题的答案是:没有

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

来自文档:

HTML5 Mode

Server side

Using this mode requires URL rewriting on server side, basically you have to rewrite all your links to entry point of your application (e.g. index.html). Requiring a <base> tag is also important for this case, as it allows AngularJS to differentiate between the part of the url that is the application base and the path that should be handled by the application.

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

对于 angular 应用 运行 在 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 下 angular 应用程序 运行
<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>