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.

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


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á.


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 ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.