AngularJS routing without the hash '#'
我在学安古拉杰,有一件事真的让我恼火。
我使用
1 2 3 4 5 | $routeProvider.when('/test', { controller: TestCtrl, templateUrl: 'views/test.html' }) .otherwise({ redirectTo: '/test' }); |
但是当我在浏览器中导航到我的应用程序时,我看到的是
所以我的问题是,为什么AngularJS将这个hash-
实际上,对于非HTML5浏览器,您需要(hashtag)。
否则,他们只会在上面提到的href处对服务器进行HTTP调用。是一个不触发请求的旧浏览器短路,它允许许多JS框架在此基础上构建自己的客户端重新路由。
您可以使用
以下是支持HTML5策略的浏览器列表:http://canius.com/feat=history
如果您像其他人所说的那样启用了html5模式,并创建一个包含以下内容的
1 2 3 4 5 6 | RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ./index.html [L] |
当用户输入正确的路线时,他们将被引导到您的应用程序,您的应用程序将读取路线并将其带到正确的"页面"。
编辑:只需确保没有任何文件或目录名与您的路由冲突。
让我们写一个简单而简短的答案。
In Router at end add html5Mode(true);
1 2 3 4 5 6 7 8 | app.config(function($routeProvider,$locationProvider) { $routeProvider.when('/home', { templateUrl:'/html/home.html' }); $locationProvider.html5Mode(true); }) |
In html head add base tag
1 2 3 4 5 | <html> <head> <meta charset="utf-8"> <base href="/"> </head> |
感谢@plus-详细说明上述答案
尝试
1 | $locationProvider.html5Mode(true) |
更多信息$locationProvider公司使用$位置
以下信息来自:https://scotch.io/quick-tips/pretty-urls-in-angularjs-removing-the-hashtag
很容易获得干净的URL并从URL中以角度删除hashtag。默认情况下,AngularJS将使用哈希标记路由URL例如:
http://www.example.com
http://www.example.com/关于
http://www.example.com//联系人
有两件事需要做。
正在配置$locationProvider
为相关链接设置基础
$location服务
在Angular中,$location服务解析地址栏中的URL,并对应用程序进行更改,反之亦然。
我强烈建议您阅读官方的Angular$location文档,了解location服务及其提供的服务。
https://docs.angularjs.org/api/ng/service/$位置
$locationProvider和HTML5Mode
- 我们将使用$locationProvider模块并将html5模式设置为true。
我们将在定义角度应用时执行此操作,并且正在配置路由。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20angular.module('noHash', [])
.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl : 'partials/home.html',
controller : mainController
})
.when('/about', {
templateUrl : 'partials/about.html',
controller : mainController
})
.when('/contact', {
templateUrl : 'partials/contact.html',
controller : mainController
});
// use the HTML5 History API
$locationProvider.html5Mode(true); });
什么是HTML5历史API?这是使用脚本操作浏览器历史记录的标准化方法。这使得Angular可以在不刷新页面的情况下更改页面的路由和URL。有关这方面的更多信息,下面是一篇优秀的HTML5历史API文章:
http://diveintohtml5.info/history.html
相对链接设置
- 要使用相对链接在应用程序周围链接,需要在文件的
中设置 。这个可能在角型应用的根index.html文件。找到 标签,然后将其设置为应用程序所需的根URL。
例如:
- 还有很多其他的配置方法,以及HTML5模式设置为true将自动解析相关链接。如果你的根您的应用程序与URL不同(例如/my base,然后把它作为你的基础。
旧浏览器的回退
- $location服务将自动回退到hashbang不支持HTML5历史记录API的浏览器的方法。
- 这对您来说是透明的,您不必配置任何有用的东西。从角度$location文档中,您可以看到回退方法及其工作方式。
总之
- 这是一种获取漂亮URL并删除你的角度应用。让这些超级干净超级有趣快速角度应用程序!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <VirtualHost *:80> ServerName my-app DocumentRoot /path/to/app <Directory /path/to/app> 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> |
NGIX重写
1 2 3 4 5 6 7 8 9 10 11 | server { server_name my-app; index index.html; root /path/to/app; location / { try_files $uri $uri/ /index.html; } } |
Azure IIS重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <system.webServer> <rewrite> <rules> <rule name="Main Rule" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> </conditions> </rule> </rules> </rewrite> </system.webServer> |
快速重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var express = require('express'); var app = express(); app.use('/js', express.static(__dirname + '/js')); app.use('/dist', express.static(__dirname + '/../dist')); app.use('/css', express.static(__dirname + '/css')); app.use('/partials', express.static(__dirname + '/partials')); 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(3006); //the port you want to use |
如果您想在OS X 10.8上本地配置它,并为Apache提供Angular服务,那么您可以在.htaccess文件中找到以下帮助:
1 2 3 4 5 6 7 8 9 | <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteBase /~yourusername/appname/public/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(css|js|html|png|jpg|jpeg|gif|txt) RewriteRule (.*) index.html [L] </IfModule> |
选项+followsymlinks如果未设置,可能会在日志中出现禁止的错误,如下所示:
1 | Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden |
Rewrite Base是必需的,否则请求将解析为您的服务器根目录,在本地默认情况下,该根目录不是您的项目目录,除非您已经专门配置了vhosts,所以您需要设置路径,以便请求找到您的项目根目录。例如,在我的机器上,我有一个/users/me/sites目录,我在其中保存所有项目。就像旧的OS X设置一样。
接下来的两行有效地表示路径不是目录或文件,因此您需要确保没有与应用程序路由路径相同的文件或目录。
下一个条件是,如果请求没有以指定的文件扩展名结尾,请在其中添加所需的内容
最后一个命令是为index.html文件提供服务——你的应用程序可以处理所有其他请求。
如果仍然有问题,请检查Apache日志,它可能会给您提供有用的提示:
1 | /private/var/log/apache2/error_log |
在Angular 6中,您可以使用路由器:
1 | RouterModule.forRoot(routes, { useHash: false }) |
**
It is recommended to use the HTML 5 style (PathLocationStrategy) as
location strategy in Angular
**因为
Use Hashlocationstrtegy only if you have to support the older
browsers.Click here to know more
您还可以使用以下代码重定向到主页(主页):
1 | { path: '', redirectTo: 'home', pathMatch: 'full'} |
如上所述指定重定向后,可以重定向其他页面,例如:
1 2 3 | { path: 'add-new-registration', component: AddNewRegistrationComponent}, { path: 'view-registration', component: ViewRegistrationComponent}, { path: 'home', component: HomeComponent} |