启用$ locationProvider.html5Mode(true)时,Angular one page site无法正常工作;

时间:2014-07-12 00:15:47

标签: html5 angularjs symfony single-page-application

我在服务器端有一个带有以下路由的应用程序

  • 主要路径:/
  • Api路径:/api/*
  • 部分路径/partials/*

我有一个带有角度的单页应用程序,具有以下路径

app.config(function($routeProvider, $locationProvider) {
    $routeProvider
      .when('/home', {templateUrl: '/partials/home', controller: 'HomeCtrl'})
      .when('/list', {templateUrl: '/partials/list', controller: 'ListCtrl'})
      .when('/details/:id', {templateUrl: '/partials/details', controller: 'DetailsCtrl'});
    $locationProvider.html5Mode(true);
});

该应用程序正常工作我可以在家之间导航,转到列表和查看详细信息。但是如果我在任何不同于'/'示例的网址中复制网址(或按F5):http://localhost/details/64c6eb79392e我得到一个404(由于服务器端不知道该路由,因此是合乎逻辑的)。

我如何解决这个问题。

我使用Symfony2构建我的服务器端应用程序

更新

这是我的.htaccess文件(我使用symfony默认值)

DirectoryIndex app.php

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]    
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]    
    RewriteRule .? %{ENV:BASE}/app.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>        
        RedirectMatch 302 ^/$ /app.php/
    </IfModule>
</IfModule>

1 个答案:

答案 0 :(得分:2)

在Symfony中创建一个控制器动作,它为任何给定的URL生成索引模板作为最后路由(所以你的/ api /和/ partials /仍然可以工作),如下所示:

/**
 * @Route("/{any}", name="any", requirements={"any" = ".*"})
 * @Template("DemoBundle:Index:index.html.twig")
 */
public function anyAction($any)
{
    return array();
}

这将生成任何网址的索引页面,而不会发出404,并且将由AngularJS来路由它