Zend Framework на nginx - PullRequest
       30

Zend Framework на nginx

16 голосов
/ 18 декабря 2008

Сайт на Zend Framework, над которым я работал, теперь переносится на рабочий сервер. Этот сервер оказывается nginx (сюрприз!). Естественно, сайт не работает должным образом, так как он был разработан на Apache и использует файл htaccess.

Мой вопрос ... у кого-нибудь есть опыт? Любые идеи о том, как перевести, что файл htaccess делает в файл nginx.conf? Я исследую это, но надеюсь, что кто-то уже имеет опыт с этим. Спасибо!

РЕДАКТИРОВАТЬ: Это текущий 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]

Ответы [ 8 ]

29 голосов
/ 17 декабря 2010
server {

 listen   80; ## listen for ipv4
 listen   [::]:80 default ipv6only=on; ## listen for ipv6

 server_name  localhost;

 access_log  /var/log/nginx/localhost.access.log;
 error_log  /var/log/nginx/localhost.error.log;

 root   /var/www/localhost/public;

 try_files $uri @php_index;

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 #
 location @php_index {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_param  SCRIPT_FILENAME /var/www/localhost/index.php;
  include fastcgi_params;
 }
}

Рекомендуется использовать try_files, когда это возможно.

16 голосов
/ 20 января 2009

Я знаю, что это довольно старая тема, но в любом случае она может помочь некоторым людям.

По сути, он перенаправляет любую ошибку 404 в index.php, но если файл существует (введите file), он устанавливает правильный корень.

Я сделал это с макушки головы. Это может не сработать сразу, и вы должны указать правильный путь и конфиг fastcgi. Я также положил все обратно в index.php, так как он должен работать так же с 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;
}
13 голосов
/ 18 декабря 2008

Я не знаю ни одного автоматического / систематического способа конвертирования htaccess-файла, вам, вероятно, придется сделать это вручную. Nginx wiki - лучший ресурс для документации по nginx.

Edit: Я сейчас использую Zend Framework на Nginx, и конфиг выглядит так:

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

Как видите, само правило перезаписи очень простое.

8 голосов
/ 17 апреля 2012

Это "официально", просто и хорошо работает:

http://wiki.nginx.org/Zend_Framework#Time_for_nginx

7 голосов
/ 26 октября 2010

Для промежуточного сервера, который может помочь;)

            fastcgi_param APPLICATION_ENV staging;
4 голосов
/ 23 марта 2009

На самом деле я запускаю nginx с сайтом drupal, который работает как Zend Framework: один index.php в качестве начальной загрузки

это правило (не тестируется на Zend Framework, просто на drupal, но должно быть похоже)

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

error_page  404              /index.php;
2 голосов
/ 07 декабря 2009

Если вы используете подкаталог для своего проекта, например http://some.url/myproject/controller/,, вам также необходимо добавить setBaseUrl в ваш файл начальной загрузки.

<?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!
    }
}

Перезапись nginx будет выглядеть так:

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

PS Знак вопроса не опечатка!

0 голосов
/ 23 марта 2009

Если бы это было вообще возможно, я бы рекомендовал установить Apache на нестандартный порт, доступный только из коробки Nginx, и иметь прокси Nginx для Apache.

Документация Nginx Proxy

...