web-dev-qa-db-fra.com

Nginx $ document_root $ fastcgi_script_name vs $ request_filename

Je ne remarque aucune différence si dans mon fichier de configuration je mets

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Ou:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Que font-ils respectivement? L'un des deux est-il meilleur que l'autre?

Merci d'avance.

16
MultiformeIngegno

Voici ce que dit la documentation:

$ request_filename

Cette variable est égale au chemin d'accès au fichier de la requête en cours, formé à partir des directives racine ou alias et de la requête URI;

$ document_root

Cette variable est égale à la valeur de la directive root pour la requête en cours;

$ fastcgi_script_name

Cette variable est égale à la demande d'URI ou, si si l'URI se termine par une barre oblique, alors la demande d'URI plus le nom du fichier d'index donné par fastcgi_index. Il est possible d'utiliser cette variable à la place de SCRIPT_FILENAME et PATH_TRANSLATED, utilisées notamment pour déterminer le nom du script en PHP.

Comme écrit ici, il y a au moins une différence lors de l'utilisation de fastcgi_index ou fastcgi_split_path_info. Peut-être qu'il y en a plus ... c'est ce que je sais en ce moment.

Exemple

Vous obtenez la demande /info/ et ont la configuration suivante:

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

SCRIPT_FILENAME serait égal à /home/www/scripts/php/info/index.php, mais en utilisant $request_filename ce serait juste /home/www/scripts/php/info/.

La configuration de fastcgi_split_path_info est également important. Voir ici pour plus d'aide: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

24
SimonSimCity

TLDR

J'ai recommandé d'utiliser $request_filename pour SCRIPT_FILENAME.


Si vous utilisez la directive root

$document_root$fastcgi_script_name est égal à $request_filename.

Si vous utilisez la directive alias

$document_root$fastcgi_script_name renverra le mauvais chemin, car $fastcgi_script_name est le chemin de l'URL, et non le chemin vers $document_root.

Exemple

Si vous avez 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;
    }
}

Demande /api/testing.php:

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

Demande /api/:

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

Et si vous utilisez $request_filename, vous devez définir l'index à l'aide de la directive index, fastcgi_index ne fonctionnera pas.

7
Steely Wing

Je suppose que ces lignes ont été tirées du fichier 'fastcgi_params' ..

Fondamentalement, vous n'obtenez aucune erreur en ce qui concerne SCRIPT_FILENAME car il est déjà défini lorsque vous avez défini votre directive racine dans votre fichier vhost. Donc, sauf si vous l'avez défini explicitement dans votre fichier vhost à l'aide de fastcgi_param la valeur de SCRIPT_FILENAME serait tiré de la directive racine .. Mais UN POINT IMPORTANT ICI. Il y a une autre variable dont nginx a besoin pour envoyer les requêtes au serveur php qui est $fastcgi_script_name et vous devez bien le définir afin d'éviter les URL répétitives et les erreurs avec les uri qui se terminent par une barre oblique.

Conclusion :

Pour que tout fonctionne super bien, tout le monde devrait définir SCRIPT_FILENAME explicitement dans le fichier 'fastcgi_params' situé dans le dossier/etc/nginx ou facilement dans le vhost de votre site situé dans le dossier sites-disponibles en incluant la ligne suivante dans le bloc d'emplacement php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

ou inclus dans le fichier 'fastcgi_params' comme vous l'avez écrit ci-dessus, de toute façon c'est la même chose. Pour plus d'informations pour connecter ngnix à PHP-FPM, allez sur:

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

J'espère que cela aiderait n'importe qui à l'avenir 'cuz il m'a fallu beaucoup de temps pour le comprendre ..

2
Dr.SMS