Nginx $ document_root $ fastcgi_script_name vs $ request_filename


16

Non posso notare alcuna differenza se nel mio file di configurazione ho impostato

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

O:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Cosa fanno rispettivamente? Uno dei due è migliore dell'altro?

Grazie in anticipo.

Risposte:


24

Ecco cosa dice la documentazione:

$ REQUEST_FILENAME

Questa variabile è uguale al percorso del file per la richiesta corrente, formata da direttive radice o alias e richiesta URI;

$ document_root

Questa variabile è uguale al valore della direttiva radice per la richiesta corrente;

$ fastcgi_script_name

Questa variabile è uguale alla richiesta URI o, se l'URI si conclude con una barra, quindi la richiesta URI più il nome del file indice fornito da fastcgi_index. È possibile utilizzare questa variabile al posto di SCRIPT_FILENAME e PATH_TRANSLATED, utilizzati, in particolare, per determinare il nome dello script in PHP.

Come scritto qui, c'è almeno una differenza quando si usa fastcgi_index o fastcgi_split_path_info . Forse ce ne sono altri ... questo è quello che so adesso.

Esempio

Ottieni la richiesta /info/e hai la seguente configurazione:

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAMEsarebbe uguale /home/www/scripts/php/info/index.php, ma usarlo $request_filenamesarebbe solo /home/www/scripts/php/info/.

Anche la configurazione di fastcgi_split_path_infoè importante. Per ulteriori informazioni, consultare qui: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info


Questo non sembra essere vero (non più, almeno). Vedi la risposta di Steely Wing.
Rimas Kudelis,

@RimasKudelis Non lo uso da un po 'di tempo, ma la documentazione non è cambiata, quindi mi aspetto che funzioni ancora - forse hai fastcgi_split_path_infobisogno di una modifica. La risposta di Steely Wing sembra essere fortemente basata sull'esperienza, non sulla documentazione.
SimonSimCity,

si, e anche il mio commento si basa sull'esperienza. Ho provato ad adeguarmi fastcgi_split_path_infoper escludere il mio prefisso alias mettendolo al di fuori delle due acquisizioni, ma non sembrava avere alcun effetto. Considerando che passare $request_filenamecome SCRIPT_FILENAMEfunziona come un incantesimo, indipendentemente dal fatto che sia coinvolto o meno un alias.
Rimas Kudelis,

In realtà, non riesco a capire perché la documentazione di NginX suggerisca persino di concatenare due stringhe per formare SCRIPT_FILENAMEin primo luogo, quando $request_filenamecontiene il nome del file effettivo risolto, senza alcun extra aggiunto. L'esempio sopra è in realtà errato, poiché $request_filenamein realtà contiene un nome file anziché solo un percorso, anche quando quel file non è stato richiesto esplicitamente. Almeno questa è la mia conclusione a partire da ieri.
Rimas Kudelis,

7

TLDR

Ho raccomandato l'uso $request_filenameper SCRIPT_FILENAME.


Se si utilizza la rootdirettiva

$document_root$fastcgi_script_nameè uguale a $request_filename.

Se si utilizza la aliasdirettiva

$document_root$fastcgi_script_namerestituirà il percorso sbagliato, perché $fastcgi_script_nameè il percorso dell'URL, non il percorso a cui si riferiscono $document_root.

Esempio

Se hai la configurazione

location /api/ {
    index  index.php index.html index.htm;
    alias /app/www/;
    location ~* "\.php$" {
        try_files      $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        # fastcgi_param  SCRIPT_FILENAME  $request_filename;
    }
}

Richiesta /api/testing.php:

  • $document_root$fastcgi_script_name == /app/www//api/testing.php
  • $request_filename == /app/www/testing.php

Richiesta /api/:

  • $document_root$fastcgi_script_name == /app/www//api/index.php
  • $request_filename == /app/www/index.php

E se si utilizza $request_filename, è necessario impostare l'indice tramite indexdirettiva, fastcgi_indexnon funzionerà.


2

Immagino che quelle righe siano state prese dal file 'fastcgi_params' ..

Fondamentalmente non si ottengono errori quando si tratta di SCRIPT_FILENAMEperché è già definito quando è stata definita la direttiva radice nel file vhost. Quindi, a meno che tu non lo abbia definito esplicitamente nel tuo file vhost usando fastcgi_paramil valore di, SCRIPT_FILENAMEverrebbe preso dalla direttiva root. Ma UN PUNTO IMPORTANTE QUI. C'è un'altra variabile di cui nginx ha bisogno per inviare le richieste al server php che è $fastcgi_script_namee devi definirlo bene per evitare URL ripetitivi ed errori con gli uri che finiscono con la barra.

Conclusione :

Per far funzionare tutto in modo eccellente, tutti dovrebbero definire SCRIPT_FILENAMEesplicitamente nel file 'fastcgi_params' situato nella cartella / etc / nginx o facilmente nel vhost del tuo sito situato nella cartella disponibile nei siti includendo la seguente riga nel blocco posizione php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

o incluso nel file 'fastcgi_params' come hai scritto sopra, in entrambi i casi è lo stesso .. Per maggiori informazioni su come connettere ngnix a PHP-FPM vai a:

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

Spero che possa aiutare chiunque in futuro, perché mi ci è voluto molto tempo per capirlo.

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.