在子目录中运行ZendFramework项目

时间:2011-04-11 10:30:34

标签: zend-framework .htaccess mod-rewrite

我有一个ZendFramework项目,我想在子目录中运行。

目前我的文档根位于 / var / www ,项目位于 / var / www / project ,包含各种文件夹( controllers public 等)都在项目目录中。

我正在尝试将来自http://webserver/project/ *的所有请求传递到 /var/www/project/public/index.php 文件。但是,尝试在 /var/www/project/.htaccess 中使用以下代码来传递所有请求不起作用:

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

/ var / www / project / public 中还有一个.htaccess文件包含完全相同的代码,但在加载 / project 网址时我刚刚看到了项目内容的目录索引。

3 个答案:

答案 0 :(得分:0)

我将项目完全独立于文档根目录,例如/home/user/projects/project

然后,只需将符号链接/var/www/project添加到/home/user/projects/project/public

如果您对任何静态资产链接(JavaScript,图像,CSS等)使用BaseUrl视图助手,它应该可以正常工作。

编辑:另一个建议是将公共目录与应用程序的其余部分分开。

例如,假设您的项目位于/home/user/projects/project,请将public目录的内容移至/var/www/project并使用以下内容编辑index.php

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', '/home/user/projects/project/application');

答案 1 :(得分:0)

我知道这是一个古老的问题,提问者很早就发现了他的问题,但我只是碰到了它。这是我发现的最简单的解决方案,希望其他任何人到这里都会看到这个。

在您的VirtualHost文件中,只需添加一个关于标记的别名即可创建像这样的VirtualHost文件

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin admin@example.com
    DocumentRoot /home/user/example.com/public_html/
    ErrorLog /home/user/example.com/logs/error.log
    CustomLog /home/user/example.com/logs/access.log combined

    Alias /zend/albums /home/user/example.com/zf2-tutorial/public 

    <Directory /home/user/example.com/public_html>
        AllowOverride All
        Header set Access-Control-Allow-Origin: "http://localhost"
    </Directory>
 </VirtualHost>

编辑:刚想通你必须编辑你的.htaccess(在公共目录中)以包含这一行(按照上面的例子):

RewriteBase /zend/albums

这是菲尔的一个非常好的答案,它与我的相似,但他完全删除了他的.htaccess文件,而是将规则放在VirtualHosts文件中。 https://stackoverflow.com/a/7563414/1031714

答案 2 :(得分:-1)

删除第一个RewriteRule:它表示所有地址都重写为空(-)和停止([L]标志)。

修改:这应该符合您的需求

RewriteCond %{REQUEST_FILENAME} !project/public/.*
RewriteRule ^project/(.*)$ project/public/$1 [NC,L]       

RewriteCond %{REQUEST_FILENAME} !-s      
RewriteCond %{REQUEST_FILENAME} !-l      
RewriteCond %{REQUEST_FILENAME} !-d      
RewriteRule ^.*$ /project/public/index.php [NC,L] 

这会重写项目/不包含public / to project / public /的任何请求。 下一个将任何对非现有文件或dir的调用重定向到同一目录中的index.php。