更改 Zend_Framework 项目中的公用文件夹位置?

Posted

技术标签:

【中文标题】更改 Zend_Framework 项目中的公用文件夹位置?【英文标题】:Change public folder location in Zend_Framework project? 【发布时间】:2011-08-11 00:26:04 【问题描述】:

我希望我服务器上的 public_html 文件夹成为我的 zend 项目中的公用文件夹。 你们知道我该怎么做吗?现在我必须使用 domain.com/public 查看我的网站

我尝试将 index.php 文件更改为此(更改了目录)

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . 'application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . 'library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

但这不起作用。知道如何解决这个问题吗?

基本上我想要一个这样的目录结构:

public_html/
----application/
----library/
----index.php

或者还有其他方法可以实现吗?无论如何,我想从我的 URL 中删除“公开”。

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果您的 .htaccess 设置正确,您不必担心人们会进入您的库文件夹,简单的重写规则可以防止这种情况发生。

下面是我用来摆脱我的 index.php 上的公共目录的内容

$path = realpath(dirname(__FILE__));
$dirs = array(
        $path . '/library',
        get_include_path()
);
$includes = implode(PATH_SEPARATOR, $dirs);
set_include_path($includes);

defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

defined('APPLICATION_ENV')
        || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

require_once 'Zend/Application.php';

$application = new Zend_Application(
                APPLICATION_ENV,
                APPLICATION_PATH . '/configs/application.ini'
);

这是我的 .htaccess

<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options -Indexes
RewriteEngine on

RewriteCond %REQUEST_FILENAME -f [OR]
RewriteCond %REQUEST_FILENAME -d
RewriteRule .* - [L]

RewriteCond %REQUEST_FILENAME -s [OR]
RewriteCond %REQUEST_FILENAME -l [OR]
RewriteCond %REQUEST_FILENAME -d

RewriteRule ^.*$ - [NC,L]
RewriteRule \.svn/.* index.php [L]
RewriteRule ^.*$ index.php [NC,L]
</IfModule>

【讨论】:

【参考方案2】:

这是错误的方法!我们有一个公用文件夹和几乎所有其他东西都在同一级别的原因是安全原因!我们不希望我们的库和应用程序代码在我们的公共文件夹中!

您唯一需要更改的是您的服务器 (apache) 虚拟主机配置,使其指向您的公用文件夹作为文档根目录。

<VirtualHost *:80>
DocumentRoot /path/to/your/public/folder
ServerName domain.com
    <Directory path/to/your/public/folder>
        AllowOverride All
    </Directory>
</VirtualHost>

【讨论】:

我在共享主机上,无权执行此操作。此外,在这种特殊情况下,Zend 在子域上运行。像sub.domain.com sub 只是public_html 文件夹内的一个文件夹,所以每个Zend 文件夹都可以通过domain.com/application 访问.. 不一定如此。只要您设置了 htaccess 权限以及文件权限,您就不必担心 即使是共享主机也提供私有目录,您可以在其中放置代码。【参考方案3】:

This post 提出了一种非常简单的方法(本质上,删除public 并将所有 ZF 文件推送到子文件夹中),但它也引用了其他几种方法。

特别是,该帖子中的 cmets 建议您只需修改子域根目录下的 .htaccess 文件,即可将所有请求推送到公共文件夹:

RewriteEngine on
RewriteRule ^.* /public/$0 [L]

然后在public 文件夹中,保留标准的.htaccess。在最坏的情况下,您还必须在Bootstrap 期间设置应用程序的baseUrl,可能通过配置。

【讨论】:

以上是关于更改 Zend_Framework 项目中的公用文件夹位置?的主要内容,如果未能解决你的问题,请参考以下文章

SVN多项目代码公用怎么实现?

更改公用文件夹名称后使用工匠服务

根据javascript中的文本行数更改textarea的高度[重复]

JavaFX:更改文本区域中的光标

更改 TextFormatter 中的文本会导致递归调用

如何使用jQuery更改文本区域中的行数