路由和谐中的CakePHP和AngularJs:htaccess规则将用户发送到index.html或bootstrap index.php

Wil*_*l M 4 .htaccess cakephp angularjs

我正在构建一个应用程序,CakePHP作为我的后端,AngularJS作为我的前端框架.

我需要在与前端代码相同的服务器上安装CakePHP,以便它可以提供我需要的JSON.

通常在CakePHP中,一个有webroot文件夹,除了js/css/less/*之外,还有一个挂钩到CakePHP的index.php.但是,添加AngularJS会增加一些复杂性,因为我还想要一个index.html.

这是我想要的控制流程:

  • 如果用户访问domain.com/,则显示index.html(但路由保持'*.com /'!)
  • 如果用户访问domain.com/#/home,请显示index.html并让Angular处理哈希路由
  • 如果用户访问domain.com/about(假设有关页面,html和所有内容,由CakePHP提供),请将它们发送到index.php.
  • 如果我使用domain.com/users/list.json进行AJAX调用,请使用index.php以便CakePHP可以为JSON提供服务.

所以我的想法是我可以.htaccess规则处理这个.但我不太清楚要写什么.

现在我有:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d #if it's not an existing directory
    RewriteCond %{REQUEST_FILENAME} !-f #if it's not an existing file
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L] #everything else, send to CakePHP
</IfModule>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

它会像在最后一个条件之后添加一行一样简单RewriteRule / index.html [L]吗?

另外,请随意使用CakePHP和AngularJS建议替代设置.

谢谢!


编辑:我想提供更多关于我用于AngularJS的构建系统的信息,以及为什么它只是从'home.ctp'视图提出问题.

我正在使用ng-boilerplate哪些karma用于测试和grunt连接,uglifying,以及在index.html中包含脚本.

我认为构建系统真的很漂亮,因为它允许我保持模块化结构.

以下是典型ng-boilerplate前端的目录结构:

ng-boilerplate/
  |- build/                    # Development build
  |  | index.html
  |  | assets/
  |  | 
  |  |- angular/
  |- grunt-tasks/
  |- karma/
  |- src/                      # Actual source code I'm editing
  |  |- app/
  |  |  |- <app logic>
  |  |- assets/
  |  |  |- <static files>
  |  |- common/
  |  |  |- <reusable code>
  |  |- less/
  |  |  |- main.less
  |- vendor/
  |  |- angular-bootstrap/
  |  |- bootstrap/
  |  |- placeholders/
  |- build.config.js           # Build configuration specific to app
  |- Gruntfile.js
  |- module.prefix
  |- module.suffix
  |- package.json
Run Code Online (Sandbox Code Playgroud)

(这里有关于这些目录和文件夹的更多信息:https://github.com/joshdmiller/ng-boilerplate)

这使得工作流程变得困难,因为我必须采用最新的"构建"(在开发期间)并在home.ctp每次编辑index.html时手动放置index.html文件.

这就是为什么我的头脑首先去了.htaccess.虽然,我明白这个想法有其自身的局限性,如果我想直接从CakePHP提供一个页面而不是将AngularJS带入图片中.

也许我可以配置构建系统将index.html放在CakePHP的home.ctp视图中.有关此解决方案的任何想法

AD7*_*six 9

把事情简单化

Cake的主要原则之一是KISS("保持简单(愚蠢)").

如果url的响应/是index.html文件的响应,则不需要更改任何重写规则

即做相当于这个:

cd app
mv webroot/index.html View/Pages/home.ctp
<edit View/Pages/home.ctp>
Run Code Online (Sandbox Code Playgroud)

如果您将以下内容放在视图文件的顶部:

<?php $this->layout = false; ?>
Run Code Online (Sandbox Code Playgroud)

您也可以将内容保留为完整的原始html文件.

这样做可以消除任何.htaccess修改的需要.

关于其中一个要点的具体说明:

如果用户访问domain.com/#/home,请显示index.html并让Angular处理哈希路由

没有什么需要这样做,因为浏览器不会发送带有请求的url片段 - 服务器上收到的url是domain.com/.

但是,如果你真的想用mod重写它

然后,所需要的只是为url添加规则/- 这是唯一的例外:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule  ^$ /index.html [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

请务必使用.htaccess多年来更改的蛋糕确切版本的规则,并使用较新版本的Cake使用旧版本的重写规则导致奇怪的行为.

请注意,目录排除条件不是必需的,可能不需要(它允许使用例如目录列表/css).