Pregunta

El sitio basado en Zend Framework He estado trabajando en ahora se está migrando a su servidor de producción. Este servidor resulta ser nginx (¡sorpresa!). Naturalmente el sitio no funciona correctamente ya que se desarrolló en Apache y se basa en un archivo .htaccess.

Mi pregunta es ... Alguien tiene alguna experiencia con esto? Cualquier ideas sobre cómo traducir lo que el archivo .htaccess hace a un archivo nginx.conf? Estoy investigando esto, pero estoy esperando que alguien ya tiene experiencia con esto. Gracias!

EDIT: Este es el .htaccess actual:

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

Solución

Sé que es un hilo bastante viejo, pero podría ayudar a algunas personas de todas formas.

Básicamente se redirige cualquier error 404 a index.php, pero si existe el archivo (archivo de tipo) se fijará la raíz derecha.

Lo hice desde la parte superior de la cabeza. Es posible que no funcione de inmediato, y usted tiene que poner el camino correcto y config fastcgi. También puse todo de nuevo a index.php como debería funcionar así con 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;
}

Otros consejos

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

Se recomienda utilizar try_files siempre que sea posible.

No sé de ninguna manera automática / sistemática para convertir el archivo htaccess, es probable que tenga que hacerlo manualmente. El Nginx wiki es el mejor recurso para la documentación nginx.

Editar Estoy corriendo Zend Framework en Nginx mí mismo y la configuración es la siguiente:

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

Como se puede ver, la regla de reescritura en sí es muy simple.

Esta es la "oficial", simple y funciona agradable:

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

Para la estadificación del servidor que podría ayudar;)

            fastcgi_param APPLICATION_ENV staging;

En realidad corro un nginx con un sitio de Drupal que funcionan como Zend Framework: index.php como uno de arranque

esta es la regla (no probados en Zend Framework, sólo en Drupal, pero debe ser similar)

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

error_page  404              /index.php;

Si utiliza un subdirectorio para su proyecto como http: //some.url/myproject/controller/ , entonces también hay que añadir setBaseUrl a su archivo de arranque.

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

La reescritura nginx se vería así:

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

PS El signo de interrogación no es error tipográfico!

Si fuera posible, yo recomendaría que la configuración de Apache en un puerto no estándar accesible sólo desde el cuadro de Nginx, y tiene Nginx proxy para Apache.

Nginx Proxy documentación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top