我看到的例子解释说我们可以通过改写角度应用程序URL。
放置
<base href="/">
然后在路线
$ locationProvider.html5Mode({ 启用:true });
并删除了#,但是当我刷新页面时,它说找不到页面。
所以下一步是通过node.js,iis或服务器端技术重新编写服务器端的URL来解决这个问题。
有没有使用服务器的方法我只能在角度端进行吗?
答案 0 :(得分:2)
问题的答案是:否。
AngularJS文档明确指出HTML5模式需要重写URL。
来自文档:
HTML5模式
服务器端
使用此模式需要在服务器端重写URL ,基本上您必须重写所有指向应用程序入口点的链接(例如index.html)。要求
<base>
标签对于这种情况也很重要,因为它允许AngularJS区分作为应用程序库的url部分和应用程序应该处理的路径。— AngularJS Developer Guide - Using $location (HTML5 Mode Server Side)
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;
<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在客户端处理它。它运作得很好。