2016-04-22 9 views
19

Voglio servire file HTML statici con NGINX, ma se il file è mancante, dovrebbe caricare un file PHP e PHP dovrebbe gestire il contenuto.Nginx per servire la pagina statica prima della dinamica

Ho provato diverse combinazioni di try_files, ma non riesco a capirlo. Ho un'applicazione PHP fittizio che assomiglia a questo:

./ 
../ 
dynamic.php 
index.php 
static/ 
static/static.html 

poi ho un piccolo codice PHP su indice come questo:

<?php 

$path = $_SERVER['REQUEST_URI']; 
$pattern = '/^\/(.*)\.html$/'; 

$matches = []; 

$results = preg_match($pattern, $path, $matches); 

if (count($matches) > 0) { 
    if ($matches[1] == "dynamic") { 
     require 'dynamic.php'; 
    } else { 
     echo "Not found!"; 
    } 
} else { 
    echo "Index page!"; 
} 

I risultati di navigazione per ogni pagina dovrebbe essere:

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message 

Questo è quello che ho ottenuto nel file di configurazione Nginx:

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

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

    root /var/www/foo; 
    index index.php; 

    location/{ 
     # Trying with 'try_files' here. No success. 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 

Ho cercato più volte ed evidentemente del tutto non riuscendo con questa linea:

try_files $uri $uri/static /index.php; 

mi manca qualcosa. Aiuto?

+0

non è forse possibile nel tuo caso per fare un po 'la riscrittura degli URL, ma gestire la pagina visualizzata con PHP per tutto il tempo? – AntoineB

risposta

5

Vorrei utilizzare la directory statica come root dei documenti. Ciò garantisce che nessuno possa eseguire direttamente /dynamic.php, tuttavia verrà inoltrato al numero index.php dal blocco di località con nome @php.

Questo esempio di configurazione non è stato verificato!

server { 
    index  index.php; 
    root  /var/www/foo/static; 
    server_name foo.bar *.foo.bar; 

    location/{ 
     try_files $uri @php; 
    } 

    location @php { 
     include fastcgi_params; 

     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/foo/index.php; 
    } 
} 
  1. non avete bisogno della direttiva listen se contiene solo 80 dal momento che questo è il default.
  2. Gli server_name s non devono contenere un punto iniziale.
  3. Il $uri contiene sempre l'URI richiesto compresa la barra iniziale (ad esempio /static.html) e nginx li prefisso con la radice documento su invocazione try_files (ad esempio /var/www/foo/static.html).Pertanto, è necessario impostare la directory static prima dello $uri (ad esempio /static$uri diventa /var/www/foo/static/static.html).
  4. Non è necessario fastcgi_split_path_info perché non si utilizza tale funzione.
  5. Il tuo try_files nella posizione PHP rende impossibile a nginx l'inoltro corretto delle cose. Una richiesta per /dynamic.html non termina su .php, quindi, try_files non riesce sempre.
+0

O '.example.com' o' example.com * .example.com'; l'uso della combinazione di entrambi non ha senso. – Fleshgrinder

+0

In realtà non è possibile aggiungere il 'try_files' all'interno del percorso' @ php' perché non esiste un file 'dynamic.html' lì e nginx non inoltrerebbe la richiesta a php-fpm. Tuttavia, ho modificato la configurazione per tenere conto del problema che hai menzionato. – Fleshgrinder

+0

Mi dispiace aver frainteso il tuo punto 2. Ho pensato che stavi dicendo che non si dovrebbe mai usare un nome server con un punto iniziale. Sono completamente d'accordo con la tua analisi –

6

Esistono diversi modi per nascondere la directory static dall'URL. Ad esempio, manipolando root, l'uso intelligente di try_files o rewrite.

Forse il più evidente è questo:

root /var/www/foo; 

location/{ 
    root /var/www/foo/static; 
    try_files $uri /index.php; 
} 

location ~ \.php$ { ... } 

in modo che nginx cerca nella cartella static per i file normali, ma la cartella principale per .php file.

Cosa stavi cercando di raggiungere è stato qualcosa di simile:

root /var/www/foo; 

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

location ~ \.php$ { ... } 

che prefisso /static qualsiasi URI prima del test per l'esistenza. /index.php deve essere l'ultimo elemento in quanto ha richiesto l'elaborazione in una posizione diversa. Vedi this document per ulteriori informazioni.

+0

Grazie per aver segnalato l'errore che ho fatto, ma il tuo suggerimento non funziona. Quando tento di andare a '/', vengono reindirizzato a '// static /' (con due barre in avanti) e quando tento di andare in '/ static.html' sono reindirizzato a'/static/'. =/ – Apollo

+0

@Apollo Non riesco a riprodurre la modalità di errore, ma ho dovuto aggiungere una dichiarazione 'try_files' al primo esempio. –

+0

@Apollo, quale dei due esempi in questa risposta hai usato per ottenere l'errore descritto nel tuo commento? – russell

1

In base al caso di esempio specifico fornito, la configurazione seguente restituirà i risultati elencati.

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

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

    root /var/www/foo; 
    index index.php; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 

    location ~ /static { 
     rewrite ^/static\.html$ /static/ last; 
     index static.html; 
    } 
    location ~/{ 
     rewrite^/index.php last; 
    } 

Cioè ...

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message 
Problemi correlati