views:

3839

answers:

6

The Zend Framework based site I have been working on is now being migrated to its production server. This server turns out to be nginx (surprise!). Naturally the site does not work correctly as it was developed on Apache and relies on an htaccess file.

My question is... anyone have any experience with this? Any ideas on how to translate what the htaccess file does to an nginx.conf file? I'm researching this but am hoping someone already has experience with this. Thanks!

EDIT: This is the current htaccess:

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

I don't know of any automatic/systematic way to convert the htaccess-file, you'll probably have to do it manually. The Nginx wiki is the best resource for nginx documentation.

Edit: I'm running Zend Framework on Nginx myself now and the config looks like this:

server {
  listen 80;
  server_name servername.com;

  root /var/www/zendapp/public;

  location / {
    index index.php;
  }

  # Deny access to sensitive files.
  location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
    deny all;
  }
  location ~ \.htaccess {
    deny all;
  }

  # Rewrite rule adapted from zendapp/public/.htaccess
  if (!-e $request_filename) {
    rewrite ^.*$ /index.php last;
  }

  # PHP scripts will be forwarded to fastcgi processess.
  # Remember that the `fastcgi_pass` directive must specify the same
  # port on which `spawn-fcgi` runs.
  location ~ \.php$ {
    include /etc/nginx/fastcgi_params;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
  }

  location = /50x.html {
      root   /var/www/default;
  }
}

As you can see, the rewrite rule itself is very simple.

mooware
+9  A: 

I know it's a pretty old thread but it might help some people anyway.

Basically it redirect any 404 to index.php, but if the file exists (type file) it will set the right root.

I did it from the top of my head. It might not be working right away, and you have to put the right path and fastcgi config. I also put everything back to index.php as it should work like that with Zend_Framework

error_page  404 /index.php;

location / {
    if (-f $request_filename) {
        root   /var/www;
    }
}

location ~ .php$ {
        fastcgi_pass   unix:/tmp/php.sock;
        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME     /var/www/index.php;
        include /etc/nginx/fastcgi_params;
}
stunti
Thx stunti. That is helpful.
gaoshan88
+1  A: 

Actually i run a nginx with a drupal site that work like zend framework: one index.php as bootstrap

this is the rule (not tested on zend framework, just on drupal, but should be similar)

location / {
            if (!-e $request_filename) {
                    rewrite  ^/(.*)$  /index.php?q=$1  last;
                    break;
        }
    }

error_page  404              /index.php;
jipipayo
+1  A: 

If it were at all possible, I would recommend that they setup Apache on a nonstandard port accessible only from the Nginx box, and have Nginx proxy to Apache.

Nginx Proxy documentation

Jordan S. Jones
Defeats the point of Nginx though, which is speed.
Billy ONeal
A: 

If you use subdirectory for your project like http://some.url/myproject/controler/, then you also need to add setBaseUrl to your bootstrap file.

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected function _initSomeFancyName()
 {
         $this->bootstrap('frontController');
         $frontController = Zend_Controller_Front::getInstance();
  $frontController->setBaseUrl('/myproject'); // set the base url!
 }
}

and Nginx rewrite would look like this:

location /myproject/ {
 if (!-e $request_filename) {
  rewrite ^/myproject/(.*)$ /index.php?$1? last;
 }
}

PS(Question mark is not typo!!)

dz0ny
A: 

For staging server that could help ;)

            fastcgi_param APPLICATION_ENV staging;
nerkn