在共享Web主机上部署

时间:2015-01-13 22:11:44

标签: apache .htaccess zend-framework2

我有一个简单的问题,但我无法在任何地方找到直截了当的答案。

我对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,但我不知道如何编写一个在这种情况下可以工作的文件。

一如既往,我们非常感谢任何帮助,

1 个答案:

答案 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主机并保留干净的项目结构。