如何在根域的子文件夹中运行 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->Form->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)包含子文件夹(例如,<form action="/version-13/signup">
)。
为什么不应该在表单中包含子文件夹?你想让它转到/version-13/signup
对吗?否则它将转到/signup
,如果我理解正确的话,它就不存在了。
/signup
是我在 routes.php 中连接的路由 - 这是一个“漂亮的 url”,所以我没有默认的 /controller/action
格式。如果该站点不在子文件夹中,则我使用$this->Form->create()
生成的任何表单都会发送到/signup
。但是,在子文件夹中时,我可以在/signup
看到页面,但所有生成的 URL 都包含子文件夹。我希望该站点能够像没有子文件夹一样工作,并且就像它位于根目录中一样。设置 Configure::write('App.baseUrl, '/');
就可以了。以上是关于如何在根域的子文件夹中运行 CakePHP 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章