Zend Framework在子目录中

时间:2011-11-30 21:26:48

标签: zend-framework dns subdirectory base-url

我正用这个敲打墙......

我需要在子目录中建立一个zend框架应用程序。

即。域名是tricell.ss,我想使用tricell.ss / tricell作为应用程序主目录。

已经完成了:

  1. 我在我的配置(application.ini)中设置了:

    resources.frontController.baseUrl = "/tricell"
    
  2. 我在配置中创建了另一个var

    baseUrl  = "/tricell"
    
  3. 在我的Boostrap中我得到了这个:

    $router     = new Zend_Controller_Router_Rewrite();
    $frontController->setRouter($router);
    $frontController->setBaseUrl($this->config->baseUrl);        
    
    $frontController->dispatch();
    
  4. 在我的布局中,我试图使用以下方式显示图像:

    $this->baseUrl('/img/btn.png')
    
  5. 以下是我的虚拟主机配置:

    <VirtualHost *:80>
    DocumentRoot "/HTDOCS/tricell/tricell/public_html"
    ServerName tricell.ss
    RewriteRule ^$ [L] 
    
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www.)?tricell.ss$
    RewriteRule ^(/)?$ tricell [L]
    </VirtualHost>
    
  6. 这是我的.htaccess:

  7. SetEnv APPLICATION_ENV开发

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    

    问题是当我试图显示图像时没有任何反应。当我试图通过URL获取图像时:

    http://tricell.ss//tricell/img/btn.png

    我收到有关错误控制器的信息。我怎么能做到这一点?我可以(没有任何问题)为tricell.ss进行根域配置,然后获取图像,即tricell / ss / img / btn.png,但我想在子目录上工作,我不能用图像来做。我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法就是:

从一个全新的ZF项目开始,或删除你创建的.htaccess或httpd.conf / httpd-vhosts.conf中的所有zend路由和任何特殊配置。

删除您在配置文件中设置的baseUrl选项。

将index.php文件和.htaccess文件放在/HTDOCS/tricell/tricell/public_html/tricell文件夹中。

将项目的其余部分(控制器,模型,配置等)放在Web根目录之外。在此示例中,我将假设它们位于/HTDOCS/tricell/tricell/zfproject

编辑index.php并更改:

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

// to:

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

现在您的应用程序将以基本目录yoursite.com/tricell

运行

IndexController.php的URL将是http://yoursite.com/tricell/index

您不需要做任何特别的事情来告诉Zend您的基本网址是“tricell”。只需确保在您的视图脚本中使用$this->baseUrl()作为路径,这样您就不必担心手动将/ tricell添加到所有内容的开头,如果您将项目移动到另一个目录/路径,则不需要需要改变以应对新的道路。

答案 1 :(得分:1)

我只是设法解决了我的问题...这很简单,但我对所有这些重写规则感到非常困惑。

总而言之,tricell令人困惑,让我们也做一些改变。 所以要达到像tricell.ss / sub这样的东西我需要:

  1. 将我的整个申请放在/ HTDOCS / tricell / tricell / sub
  2. 从此行更改我的虚拟主机:DocumentRoot“/ HTDOCS / tricell / tricell / public_html”to:DocumentRoot“/ HTDOCS / tricell / tricell /”
  3. 在我的/ HTDOCS / tricell / tricell / sub目录中插入另一个.htaccess:

    RewriteEngine On

  4. RewriteRule ^ .htaccess $ - [F]

    RewriteCond%{REQUEST_URI} =“” RewriteRule ^。* $ /sub/ublic_html/index.php [NC,L]

    RewriteCond%{REQUEST_URI}!^ / sub / public_html /。 $ RewriteRule ^(。)$ / sub / public_html / $ 1

    RewriteCond%{REQUEST_FILENAME} -f RewriteRule ^。* $ - [NC,L]

    RewriteRule ^ public_html /.*$ /sub/public_html/index.php [NC,L]

    这解决了我的所有问题。

答案 2 :(得分:0)

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_URI} "/tour/"
 RewriteRule (.*) /tour/index.php [L,END]
</IfModule>

上面的代码在根文件夹domain.com/.htaccess中对我有用。我将它直接放在htaccess中的“#BEGIN WordPress”部分之前。

  • 在domain.com/tour/子目录中具有Zend安装
  • 在root domain.com/级别上运行的wordpress

如果Request_URI匹配/ tour /

,最后的诀窍是让RewriteRule指向Zend的index.php。