在共享 Web 主机上部署

Deploy on Shared Web Host

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

我对 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 开发人员已经解决了这个问题。我想我应该向 /root 添加一个 .htaccess 文件,但我不知道如何编写在这种情况下可以使用的文件。

一如既往,非常感谢您的帮助,

为了完成这项工作,您必须从 /public 文件夹中取出所有内容并将其放入您的网络根目录中。必须编辑框架应用程序中的文件 index.php 以考虑其新位置。

首先删除行:

chdir(dirname(__DIR__));

因为它的目的是将当前目录设置为我们已经在里面的网络根目录。

其次,您必须:

require 'init_autoloader.php' 行替换为 require 'vendor/autoload.php'(如果使用 composer)。

在您的 .htaccess 中,将 ZF2_PATH 环境变量设置为您服务器上安装 zf2 的位置:

#First line of your .htaccess
SetEnv ZF2_PATH path/to/zf2

现在它应该可以正常工作了。

让它变得更好

通过上述设置,您必须将所有 public 文件夹放入网络根目录。如果您和我一样不喜欢,请继续阅读。

您可以将 public 文件夹(例如 /js/css)放在 /public 中(index.php.htaccess 仍然需要位于根目录中)通过简单地告诉 zf2 你的新 base_path。这是视图脚本中的 basePath() 视图助手所使用的。您只需将以下内容添加到您的配置中:

'view_manager' => array(
    'base_path' => './public',
),

并且 basePath() 视图助手将输出正确的 url。

做得更好

此设置的最后一个问题是您的应用程序文件可从网络访问。为了解决这个问题,我把我想隐藏的所有东西都放在 /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 主机并保留干净的项目结构。