Nginx: indirizza tutte le richieste a un singolo script


11

Ho uno script PHP che gestisce il routing degli script e fa ogni sorta di cose fantasiose. È stato originariamente progettato per Apache, ma sto provando a migrarlo su nginx per alcune delle mie scatole. In questo momento, sto cercando di appianare le cose su un server di prova.

Quindi il modo in cui funziona lo script è che intercetta tutto il traffico HTTP per la directory (in Apache) usando un .htaccessfile. Ecco come appare:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

Abbastanza diretto. Tutte le richieste vengono eseguite index.php, chiare e semplici.

Sto cercando di imitare quel comportamento su nginx, ma non ho ancora trovato un modo. Qualcuno ha qualche suggerimento?

Ecco una copia del mio nginx.conffile al momento. Si noti che è stato progettato per me solo per provare a farlo funzionare; principalmente un lavoro di copia / incolla.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

Risposte:


13

Aggiungi questo,

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

Quello che fa è prima controllare l'esistenza di $ uri e $ uri / come file / cartelle reali e se non esistono andranno semplicemente attraverso /index.php (questa è la mia configurazione per il framework Zend in cui il routing viene eseguito tramite l'indice .php) - ovviamente se hai bisogno di passare alcuni parametri, aggiungi semplicemente /index.php a? q = alla fine e passerà i parametri.

Assicurarsi che la direttiva try_file sia disponibile dalla versione 0.7.27 e successive.


Attenzione: questo non funzionerà con gli URL che finiscono .php , per esempio questo funzionerà/doesNotExist.ph/doesNotExist.php
:,

7

L'ho capito da solo! Si!

Tutto ciò di cui avevo bisogno per il locationblocco era:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

Tutto il resto è rimasto sostanzialmente uguale.


Hai provato quello che ho scritto di seguito? Inoltre significa che tutti i tuoi file statici passeranno attraverso index.php - non sono sicuro di volerlo.
Adam Benayoun,

@Adam: sì, ho provato il tuo codice. Volevo che tutto passasse attraverso index.php. Grazie comunque!
mattbasta,

2

Per conservare gli argomenti GET, utilizzare quanto segue:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_args diventa '?' se $ args non è vuoto

O ancora più semplice:

location / {
    try_files /index.php$is_args$args;
}

Attenzione: questo non funzionerà con gli URL che finiscono .php , per esempio questo funzionerà/doesNotExist.ph/doesNotExist.php
:,

1

Dopo aver impostato la directory principale aggiungere questo

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

In base alle tue necessità puoi cambiare regex in quanto hai bisogno di governare query_string in index.php


4
Ci sono modi migliori che ifrealizzare ciò che sta chiedendo. wiki.nginx.org/IfIsEvil
Isius,

0

Una trappola molto importante a cui prestare attenzione quando il tuo target è un file PHP è assicurarsi che qualunque cosa return/ rewriteregola tu usi non superi la location ~ \.phpdirettiva. In questo caso, nginx servirà il tuo file PHP senza renderlo, rivelando il codice sorgente PHP. Questo può essere catastrofico.

Il modo più sicuro è già fornito, location / { try_files $uri $uri/ /index.php; }

Assicurati di impostare anche index index.phpnel location /blocco e rimuovere il commento dal location ~ \.phpblocco incluso nel file di configurazione predefinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.