使用.htaccess规则从文件夹中运行Zend Framework

时间:2011-04-13 22:52:12

标签: php zend-framework .htaccess mod-rewrite

问候。基本上,我正在尝试从文件夹中运行Zend Framework应用程序(实际上是多个) - 但是没有指定公共目录。我知道这听起来很脏,但我有我的理由,所以这超出了我的问题范围。

例如,这可能是我的ZF“安装”之一:
http://www.myurl.com/project1/
(其他人可能在/ project2 /等)

我正在使用标准的ZF目录结构。我也熟悉在项目文件夹中放置.htaccess以将流量重定向到/ public /的常用于Zend Framework共享托管环境的各种方法 - 问题是当你的项目根不是基本URL,它似乎不起作用。

具体来说,如果我将以下.htaccess文件放在/ project1 /

  

RewriteEngine On   RewriteRule ^(。*)$ public / $ 0 [L]

我收到一个ZF错误页面说明:

  

指定的控制器无效(project1)

所以似乎认为文件夹名称是控制器。

如果我使用这里解释的更长的解决方案,我会遇到同样的问题: http://www.alberton.info/zend_framework_mod_rewrite_shared_hosting.html

(显然,我用包含“my”路径的路径替换路径,即。/ project1 /)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

好的,我之前的回答是愚蠢的。尝试不同的方法。

this post的评论指出了此问题,但可以通过在应用的前端控制器上设置baseUrl来处理。

我会在application/configs/application.ini(可能是每个环境)中添加一个条目,然后在Bootstrap中设置它。这应该允许路由忽略/project1/前缀并关注其余的URL。

<强>更新

我会设置一个像application.ini这样的键,类似于:

[production]
settings.baseUrl = "/project1"

如果每个环境有所不同,那么您可以为每个环境添加一个条目:

[development:production]
settings.baseUrl = "/some/local/url/prefix/project1"

然后在application/Bootstrap.php中添加如下方法:

protected function _initBaseUrl()
{
    $options = $this->getOptions();
    $baseUrl = isset($options['settings']['baseUrl']) 
        ? $options['settings']['baseUrl']
        : null;  // null tells front controller to use autodiscovery, the default
    $this->bootstrap('frontcontroller');
    $front = $this->getResource('frontcontroller');
    $front->setBaseUrl($baseUrl);
}

应该这样做。

答案 1 :(得分:0)

根据David的回答,如果您不需要在/ public中重写资源,请执行以下操作

假设您在url domain.com/yourapplication上有一个项目

像这样创建/.htaccess

RewriteEngine on

RewriteRule    ^$ public/    [L]
RewriteRule    (.*) public/$1 [L]

在/application/configs/application.ini中添加

settings.baseUrl = "/yourapplication"

在/application/Bootstrap.php中添加

protected function _initBaseUrl()
    {
        $options = $this->getOptions();
        $baseUrl = isset($options['settings']['baseUrl']) 
            ? $options['settings']['baseUrl']
            : null;  // null tells front controller to use autodiscovery, the default
        $this->bootstrap('frontcontroller');
        $front = $this->getResource('frontcontroller');
        $front->setBaseUrl($baseUrl);
    }

现在,当您在浏览器中访问domain.com/yourapplication时,htaccess会将所有无效文件请求重定向到domain.com/yourapplication/public,并将前端控制器设置为您的应用程序。