Nginx $ document_root $ fastcgi_script_name vs $ request_filename

16

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.

MultiformeIngegno
la source

Réponses:

24

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 racine de directive pour la demande actuelle;

$ fastcgi_script_name

Cette variable est égale à la demande d'URI ou, 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 avez la configuration suivante:

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

SCRIPT_FILENAMEserait égal /home/www/scripts/php/info/index.php, mais son utilisation $request_filenameserait juste /home/www/scripts/php/info/.

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

SimonSimCity
la source
Cela ne semble pas être vrai (plus maintenant, du moins). Voir la réponse de Steely Wing.
Rimas Kudelis
@RimasKudelis Je n'ai pas utilisé cela depuis un bon moment, mais la documentation n'a pas changé, donc je m'attends à ce qu'elle fonctionne toujours - peut-être que vous avez fastcgi_split_path_infobesoin d'un ajustement. La réponse de Steely Wing semble être fortement basée sur l'expérience et non sur la documentation.
SimonSimCity
oui, et mon commentaire est également basé sur l'expérience. J'ai essayé de régler fastcgi_split_path_infopour exclure mon préfixe d'alias en le mettant en dehors des deux captures, mais cela ne semblait pas avoir d'effet. Alors que le passage $request_filenameque SCRIPT_FILENAMEfonctionne comme un charme, peu importe si oui ou non un alias est impliqué.
Rimas Kudelis
En fait, je ne comprends pas pourquoi la documentation NginX suggère même de concaténer deux chaînes pour se former SCRIPT_FILENAMEen premier lieu, lorsque $request_filenamecontient le nom de fichier réel résolu, sans aucun supplément ajouté. L'exemple ci-dessus est en fait incorrect, car $request_filenameil contient en fait un nom de fichier plutôt qu'un simple chemin d'accès, même lorsque ce fichier n'a pas été demandé explicitement. C'est du moins ma conclusion d'hier.
Rimas Kudelis
7

TLDR

J'ai recommandé une utilisation $request_filenamepour SCRIPT_FILENAME.


Si vous utilisez la rootdirective

$document_root$fastcgi_script_nameest égal à $request_filename.

Si vous utilisez la aliasdirective

$document_root$fastcgi_script_namerenverra le mauvais chemin, car $fastcgi_script_namec'est le chemin de l'URL, pas le chemin auquel se rapporter $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 en utilisant la indexdirective, fastcgi_indexne fonctionnera pas.

Aile d'acier
la source
2

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

Fondamentalement, vous n'obtenez aucune erreur en ce qui concerne, SCRIPT_FILENAMEcar il est déjà défini lorsque vous avez défini votre directive racine dans votre fichier vhost. Donc, à moins que vous ne l'ayez défini explicitement dans votre fichier vhost en utilisant fastcgi_paramla valeur de, cela SCRIPT_FILENAMEproviendrait 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_nameet 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_FILENAMEexplicitement soit 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 ..

Dr.SMS
la source