Nginx $ document_root $ fastcgi_script_name vs $ request_filename

16

No puedo notar ninguna diferencia si en mi archivo de configuración configuro

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

O:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

¿Qué hacen respectivamente? ¿Es uno de los dos mejor que el otro?

Gracias por adelantado.

MultiformeIngegno
fuente

Respuestas:

24

Esto es lo que dice la documentación:

$ request_filename

Esta variable es igual a la ruta al archivo para la solicitud actual, formada por las directivas root o alias y solicitud de URI;

$ document_root

Esta variable es igual al valor de la raíz de la directiva para la solicitud actual;

$ fastcgi_script_name

Esta variable es igual a la solicitud de URI o, si el URI concluye con una barra diagonal, entonces la solicitud de URI más el nombre del archivo de índice dado por fastcgi_index. Es posible usar esta variable en lugar de SCRIPT_FILENAME y PATH_TRANSLATED, utilizada, en particular, para determinar el nombre del script en PHP.

Como está escrito aquí, hay al menos una diferencia cuando se usa fastcgi_index o fastcgi_split_path_info . Tal vez hay más ... eso es lo que sé en este momento.

Ejemplo

Obtiene la solicitud /info/y tiene la siguiente configuración:

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

SCRIPT_FILENAMEsería igual /home/www/scripts/php/info/index.php, pero usarlo $request_filenamesimplemente sería /home/www/scripts/php/info/.

La configuración de fastcgi_split_path_infoes importante también. Consulte aquí para obtener más ayuda: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

SimonSimCity
fuente
Esto no parece ser cierto (ya no, al menos). Ver la respuesta de Steely Wing.
Rimas Kudelis
@RimasKudelis No he usado esto en bastante tiempo, pero la documentación no ha cambiado, así que espero que siga funcionando, tal vez fastcgi_split_path_infonecesites un ajuste. La respuesta de Steely Wing parece estar muy basada en la experiencia, no en la documentación.
SimonSimCity
Sí, y mi comentario también se basa en la experiencia. Traté de ajustar fastcgi_split_path_infopara excluir mi prefijo de alias colocándolo fuera de las dos capturas, pero no pareció tener ningún efecto. Mientras que pasar $request_filenamecomo SCRIPT_FILENAMEfunciona como un encanto, independientemente de si se trata de un alias o no.
Rimas Kudelis
En realidad, no puedo entender por qué la documentación de NginX incluso sugiere concatenar dos cadenas para formar SCRIPT_FILENAMEen primer lugar, cuando $request_filenamecontiene el nombre real del archivo resuelto, sin ningún agregado adicional. El ejemplo anterior es realmente incorrecto, ya que $request_filenamede hecho contiene un nombre de archivo en lugar de solo una ruta, incluso cuando ese archivo no se solicitó explícitamente. Al menos esa es mi conclusión de ayer.
Rimas Kudelis
7

TLDR

Lo recomendé usar $request_filenamepara SCRIPT_FILENAME.


Si usa la rootdirectiva

$document_root$fastcgi_script_namees igual a $request_filename.

Si usa la aliasdirectiva

$document_root$fastcgi_script_namedevolverá la ruta incorrecta, porque $fastcgi_script_namees la ruta de la URL, no la ruta relacionada $document_root.

Ejemplo

Si tienes config

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

Solicitud /api/testing.php:

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

Solicitud /api/:

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

Y si lo usa $request_filename, debe establecer el índice usando la indexdirectiva, fastcgi_indexno funcionará.

Ala de acero
fuente
2

Supongo que esas líneas fueron tomadas del archivo 'fastcgi_params' ...

Básicamente, no recibe ningún error cuando se trata de SCRIPT_FILENAMEporque ya está definido cuando definió su directiva raíz en su archivo vhost. Entonces, a menos que lo haya definido explícitamente en su archivo vhost, fastcgi_paramel valor de SCRIPT_FILENAMEse tomaría de la directiva raíz. Pero UN PUNTO IMPORTANTE AQUÍ. Hay otra variable que nginx necesita para enviar las solicitudes al servidor php que es $fastcgi_script_namey debe definirla bien para evitar URL repetitivas y errores con uri que terminan con una barra inclinada.

conclusión :

Para que todo funcione súper bien, todos deben definir SCRIPT_FILENAMEexplícitamente en el archivo 'fastcgi_params' ubicado en la carpeta / etc / nginx o fácilmente en el servidor virtual de su sitio ubicado en la carpeta de sitios disponibles al incluir la siguiente línea en el bloque de ubicación php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

o incluido en el archivo 'fastcgi_params' como escribió anteriormente, de cualquier manera es lo mismo. Para obtener más información para conectar ngnix a PHP-FPM, vaya a:

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

Espero que ayude a cualquiera en el futuro porque me llevó mucho tiempo resolverlo ...

Dr.SMS
fuente