1

I have a ZendFramework project that I would like to run inside a subdirectory.

Currently my document root is at /var/www and the project is at /var/www/project with the various folders (controllers, public, etc.) all within the project directory.

I am trying to make it so that all requests from http://webserver/project/* are being passed to the /var/www/project/public/index.php file. However, trying to use the following code in /var/www/project/.htaccess to pass all requests does not work:

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]

There is also an .htaccess file in /var/www/project/public that contains exactly the same code, but when loading the /project URL I am just presented with a directory index of the project contents.

tombazza
  • 646
  • 9
  • 24

3 Answers3

0

I know this is an old question and the asker has long since figured out his problem but I just ran into it. This is the solution I found that worked the simplest and hopefully anybody else that arrives here will see this.

In your VirtualHost file simply add an Alias right about your tag to create a VirtualHost file like this

<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>

Edit: Just figured out you will have to edit your .htaccess (in the public directory) to include this line (going with the above example):

RewriteBase /zend/albums

Here's a pretty good answer by Phil that's similar to mine but he removes his .htaccess files completely and instead puts the rules inside the VirtualHosts file. https://stackoverflow.com/a/7563414/1031714

Community
  • 1
  • 1
Nathan C.
  • 319
  • 3
  • 8
0

I'd store the project completely separate to the document root, for example /home/user/projects/project.

Then, simply symlink /var/www/project to /home/user/projects/project/public.

Provided you use the BaseUrl view helper for any static asset links (JavaScript, images, CSS, etc), it should work just fine.

Edit: Another suggestion is to separate your public directory from the rest of the application.

For example, say your project is in /home/user/projects/project, move the contents of your public directory to /var/www/project and edit index.php with the following

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', '/home/user/projects/project/application');
Phil
  • 157,677
  • 23
  • 242
  • 245
-1

Remove the first RewriteRule: it is saying for all addresses rewrite to nothing (-) and stop ([L] flag).

Edit: This should fits your needs

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] 

This rewrites any request to project/ not containing public/ to project/public/. The next one redirects any call to non existing file or dir to index.php in the same directory.

M'vy
  • 5,696
  • 2
  • 30
  • 43
  • No, it says to leave all requests for real files (with size greater than zero), symbolic links and directories alone. – Phil Apr 12 '11 at 01:23
  • Yes but when he calls `project/` that is a directory, he got no rewrites so he just end up in `/var/www/project/` instead of `/var/www/project/public`. – M'vy Apr 12 '11 at 07:56