【问题标题】:AngularJS $routeProvider can't load directly to partialAngularJS $routeProvider 无法直接加载到部分
【发布时间】:2014-09-24 19:42:46
【问题描述】:

目前我正在使用 $routeProvider 来动态加载页面的各个部分,如下所示:

$routeProvider
    .when('/', {
        templateUrl: '/pages/home.html',
        controller: 'mainController'
    })
    .when('/our-business', {
        templateUrl: '/pages/our-business.html',
        controller: 'businessController',
        css: 'css/_business.css'
    })
    .when('/solutions', {
        templateUrl: '/pages/solutions.html',
        controller: 'solutionsController'
    });

目前,如果我直接进入索引 (localhost),然后从导航菜单中选择“我们的业务”,那么 Angular 会处理位置请求并且页面加载正常,URL 更改为 localhost/our-业务。如果我然后重新加载或直接打开此 URL,我会收到 404 错误 - 可能是因为 Apache 试图打开不存在的 our-business.html。如果我打开 localhost/#/our-business 然后加载索引,然后 Angular 处理请求。我遇到的问题是,这是一个面向公众的网站,所以如果用户要复制和粘贴 URL 或通过电子邮件共享它,他们会收到 404 错误。

有没有办法让 Apache 重写 URL 以通过索引和 AngularJS 解析它们,这样我们就可以保持非散列样式但仍然有功能性 URL?

【问题讨论】:

  • 你可以尝试使用 HTML5 模式,如 $locationProvider.html5Mode(true);。更多详情请参考this
  • 我遇到了同样的问题。这就是我修复它的方法:stackoverflow.com/a/21484874

标签: javascript angularjs apache angularjs-routing


【解决方案1】:

正如 Kailash 所说,您可以将 locationProvider 设置为 html5 模式

$locationProvider.html5Mode(true)

当你引导你的 Angular 应用程序时。

然后您必须告诉您的 Apache 服务器为任何请求的 url 发送 index.html(单页应用程序的入口点)。

然后角度路由器将处理正确的路由

【讨论】:

  • 感谢 Laurent,这看起来很有希望,但是当我在服务器上设置以下重写时: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !index RewriteRule (.*) /synergi/index.html [L] 所有的javascript文件都被index.html代码替换了。
  • 是的,对不起,我不清楚:照常提供您的静态数据,但任何与您的静态文件夹不匹配的 url 都应返回 index.html
【解决方案2】:

不。更改不带哈希的 url 会重新加载整个页面。

$routeProvider 的全部意义在于构建具有多个视图的单页应用程序。

基本上,在网址中添加# 是唯一的方法。更改 url 的哈希值不会导致页面重新加载,并允许 Angular 加载相关视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多