我有一个简单的问题,但我无法在任何地方找到直截了当的答案。
我对apache .htaccess不太熟悉,现在我应该在Web主机上部署一个ZF2应用程序,不允许我更改网站根文件夹。
我有一个标准的项目结构,所以我的index.php
文件位于/public
文件夹中,如下所示:
www.mydomain.com
root/ <--- I can't set root to /public folder
/config
...
/module
...
/public
.htaccess
index.php
...
/vendor
...
...
这是来自ZF2骨架应用程序。
我需要一个解决方法,我确信这是许多ZF2开发人员已经解决的常见问题。我想我应该将{.htaccess文件添加到/root
,但我不知道如何编写一个在这种情况下可以工作的文件。
一如既往,我们非常感谢任何帮助,
丹
答案 0 :(得分:1)
为了完成这项工作,您必须从/public
文件夹中取出所有内容并将其放入Web根目录中。必须编辑骨架应用程序中的文件index.php
以考虑其新位置。
首先删除该行:
chdir(dirname(__DIR__));
因为它的目的是将当前目录设置为我们已经在其中的Web根目录。
其次你必须:
将行require 'init_autoloader.php'
替换为require 'vendor/autoload.php'
(如果使用作曲家)。
或强>
在.htaccess
内,将ZF2_PATH
env变量设置为服务器上安装zf2的位置:
#First line of your .htaccess
SetEnv ZF2_PATH path/to/zf2
现在应该可以了。
通过上述设置,您必须将所有公共文件夹放在Web根目录中。如果你像我一样不喜欢那就继续阅读。
您可以将公共文件夹(例如/js
,/css
)放在/public
内(index.php
和.htaccess
仍需要在根目录中)只需告诉zf2你的新base_path
。这是视图脚本中basePath()
视图助手所使用的内容。您只需将以下内容添加到配置中:
'view_manager' => array(
'base_path' => './public',
),
basePath()
视图助手将输出正确的网址。
此设置的最后一个问题是您的应用文件可以从网络访问。为了解决这个问题,我把我要隐藏的所有内容放在/private
文件夹中。最终得到类似于此的项目结构:
/root
/private
/config
/data
/module
/vendor
.htaccess <-- You have to create this one
composer.json
composer.lock <-- Created by composer after install
composer.phar
/public
/css
/js
.htaccess
index.php
在/private
文件夹中,您必须创建一个新的.htaccess
文件并将此行放入其中:
Deny from all
这使得无法从网络访问文件夹中的所有内容。
通过此更改,您已破坏了应用。在/private/config/application.config.php
内部,您必须调整module_paths
配置:
'module_listener_options' => array(
'module_paths' => array(
'./module',
'./vendor',
),
),
您必须在路径前加/private
:
'module_listener_options' => array(
'module_paths' => array(
'./private/module',
'./private/vendor',
),
),
这将使您的应用再次运行。现在,您可以将ZF2应用程序部署到共享Web主机并保留干净的项目结构。