如何在根域的子文件夹中运行 CakePHP 应用程序?

Posted

技术标签:

【中文标题】如何在根域的子文件夹中运行 CakePHP 应用程序?【英文标题】:How do I run a CakePHP app in a sub-folder from the root domain? 【发布时间】:2013-10-09 05:57:42 【问题描述】:

我正在尝试在子文件夹中设置一个 Cakephp 应用程序,但从根域运行它,例如,用户请求 domain.co.uk 并且他们在 DOCUMENT_ROOT/version-13/app/webroot 获得 webroot。

托管设置不允许我更改文档根目录,因此我在根目录中有以下 .htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteRule    ^$ version-13/app/webroot/    [L]
  RewriteRule    (.*) version-13/app/webroot/$1 [L]
</IfModule>

这似乎完成了这项工作。但是,Cake 检测到子文件夹并将其添加到它创建的所有 URL(例如,$this-&gt;Form-&gt;create() 操作等),所以我最终将表单发布到 domain.co.uk/version-13/signup 而不是 domain.co.uk/signup

我知道这可能会很简单,但我遇到了难题。无论我尝试什么,我都无法让它工作!

【问题讨论】:

你为什么要在不同的地方上传你的版本?你看过version control吗?例如:git 或 subversion? 我正在使用 Git 进行版本控制,这更适用于部署。我在这台主机上可以做的事情有限(并且没有 VPS 选项)所以我的想法是我可以git archive master,将新版本上传到单独的文件夹中,进行测试然后切换路径实现零停机升级。 啊,好吧。听起来很有创意:) 【参考方案1】:

很难理解您的设置,您应该多解释一下。但如果我做对了,请检查 /app/Config/core.php:

Configure::write('App.fullBaseUrl', 'http://example.com');

【讨论】:

设置此选项没有任何效果。但是,我注意到设置 Configure::write('App.baseUrl, '/'); 确实如此。它现在按预期工作 - 所有生成的 URL 都没有版本文件夹前缀。谢谢!【参考方案2】:

将您的 RewriteBase / 更改为 RewriteBase /version-13/(在您的 .htaccess 中),您应该正确设置。

当我没有正确设置本地服务器时,我遇到了完全相同的问题,这迫使我将应用程序放在主域的文件夹中。

请注意,您可以拥有multiple apps at one core。这可能对您“版本控制”有用。

附言。快速谷歌搜索后,我发现了以下内容。没读得那么好,但看起来也一样。 http://cookingwithcakephp.blogspot.nl/2008/04/installing-cakephp-into-subdirectory.html

【讨论】:

谢谢,我尝试了你的建议(以及链接文章中的建议——在我发帖之前我实际上已经在那里了!)。将 RewriteBase 设置为 version 文件夹的工作方式相同 - 页面正确响应 routes.php 中的路由,但生成的 URL(例如,用于表单的 URL)包含子文件夹(例如,&lt;form action="/version-13/signup"&gt;)。 为什么不应该在表单中包含子文件夹?你想让它转到/version-13/signup 对吗?否则它将转到/signup,如果我理解正确的话,它就不存在了。 /signup 是我在 routes.php 中连接的路由 - 这是一个“漂亮的 url”,所以我没有默认的 /controller/action 格式。如果该站点不在子文件夹中,则我使用$this-&gt;Form-&gt;create() 生成的任何表单都会发送到/signup。但是,在子文件夹中时,我可以在/signup 看到页面,但所有生成的 URL 都包含子文件夹。我希望该站点能够像没有子文件夹一样工作,并且就像它位于根目录中一样。设置 Configure::write('App.baseUrl, '/'); 就可以了。

以上是关于如何在根域的子文件夹中运行 CakePHP 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在奏鸣曲管理员中为路由设置主机?

如何在 CakePHP 安装附近的子文件夹中安装 Laravel

Laravel 5.2 路由仅适用于根目录

根域的 Href 值? [关闭]

Azure 存储容器和来自通配符根域的路由

DNS&BIND——DNS的子域授权和定义转发服务器