2013-11-01 15 views
13

Voglio far funzionare l'applicazione Zend Framework 2 all'interno del server Nginx. Potrei accedere alla homepage, ma non ho potuto accedere ad altri moduli. Ho scoperto che Nginx ha bisogno di una regola di riscrittura per accedere all'URL come dominio/album. La domanda è come convertire le regole predefinite .htaccess di Zend Framework 2 nella regola di riscrittura di Nginx?Come far funzionare Zend Framework 2 con nginx?

Ecco le regole: .htaccess

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ 
RewriteRule ^(.*) - [E=BASE:%1] 

RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] 

risposta

19

Davvero non è necessario alcun regole di riscrittura per rendere Nginx e ZF2 di bel gioco insieme. Ecco una configurazione Nginx molto semplice che utilizzo:

server { 
    listen *:80; 
    server_name DOMAIN; 

    # Character Set 
    charset utf-8; 

    # Logs 
    access_log /vhosts/DOMAIN/logs/access_log main; 
    error_log /vhosts/DOMAIN/logs/error_log; 

    # Directory Indexes 
    index index.php; 

    # Document Root 
    root /vhosts/DOMAIN/public; 

    # Location 
    location/{ 
     try_files $uri $uri/ /index.php; 
    } 

    # Error Pages 
    error_page 404 /404.html; 
    error_page 500 502 503 504 /50x.html; 

    # PHP-FPM Support 
    location ~ \.php$ { 
     fastcgi_pass unix:/usr/local/etc/php-fpm/DOMAIN.sock; 
     include fastcgi.conf; 
    } 

    # Block access to .htaccess 
    location ~ \.htaccess { 
     deny all; 
    } 
} 

Ovviamente modificare i percorsi per la configurazione corrente. Dato che non hai menzionato il tipo di installazione di PHP che stai usando, non posso aiutarti perché sto usando PHP-FPM.

Utilizzando questa semplice installazione tutti i miei moduli funzionano come previsto. Per esempio ho potuto visitare http://example.com/some/url O http://example.com/index.php/some/url

Nginx ha anche una semplice configurazione per ZF http://wiki.nginx.org/Zend_Framework#Time_for_nginx

Modifica 1 - Aggiunto fastcgi_params config

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
fastcgi_param QUERY_STRING  $query_string; 
fastcgi_param REQUEST_METHOD  $request_method; 
fastcgi_param CONTENT_TYPE  $content_type; 
fastcgi_param CONTENT_LENGTH  $content_length; 

fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
fastcgi_param REQUEST_URI  $request_uri; 
fastcgi_param DOCUMENT_URI  $document_uri; 
fastcgi_param DOCUMENT_ROOT  $document_root; 
fastcgi_param SERVER_PROTOCOL $server_protocol; 
fastcgi_param HTTPS    $https if_not_empty; 

fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR  $remote_addr; 
fastcgi_param REMOTE_PORT  $remote_port; 
fastcgi_param SERVER_ADDR  $server_addr; 
fastcgi_param SERVER_PORT  $server_port; 
fastcgi_param SERVER_NAME  $server_name; 

# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS 200; 
+0

Wow! Mi aiuta davvero ad accedere ad altri moduli! Grazie mille! –

+0

Come hai configurato il tuo "fastcgi_param SCRIPT_FILENAME" ho un problema in questo caso perché solo questo funziona: "fastcgi_param SCRIPT_FILENAME $ document_root/index.php;" e ora nessuna route "domain/[anything] /index.php" non può essere instradata? – Gizzmo

+0

@Gizzmo come richiesto, ho aggiornato la risposta per fornire le informazioni che hai richiesto. – Diemuzi

9

Per seguire sulla risposta di Diemuzi.

Si ricorda, che se si vuole parametri di query da lavorare nella propria applicazione, devi passare insieme con try_files

modo migliore che ho trovato è quello di utilizzare sia $is_args e $args. $is_args imposta solo un punto interrogativo se sono presenti argomenti e $args passa gli argomenti della query.

Sostituire

try_files $uri $uri/ /index.php;

con

try_files $uri $uri/ /index.php$is_args$args;

Ora è possibile utilizzare query di params come normalmente nell'applicazione ZF2 per esempio in un controller di default

$query_params = $this->params()->fromQuery();