Nginx $ document_root $ fastcgi_script_name vs $ request_filename

15

Ich kann keinen Unterschied feststellen, wenn ich in meiner Konfigurationsdatei festgelegt habe

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Oder:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Was machen sie jeweils? Ist einer der beiden besser als der andere?

Danke im Voraus.

MultiformeIngegno
quelle

Antworten:

24

In der Dokumentation heißt es:

$ request_filename

Diese Variable entspricht dem Pfad zur Datei für die aktuelle Anforderung, der sich aus dem Stammverzeichnis oder dem Alias ​​und der URI-Anforderung zusammensetzt.

$ document_root

Diese Variable entspricht dem Wert der Direktivenwurzel für die aktuelle Anforderung.

$ fastcgi_script_name

Diese Variable entspricht der URI-Anforderung oder, wenn die URI mit einem Schrägstrich endet, der URI-Anforderung plus dem Namen der Indexdatei, die von fastcgi_index angegeben wird. Diese Variable kann anstelle von SCRIPT_FILENAME und PATH_TRANSLATED verwendet werden, um insbesondere den Namen des Skripts in PHP zu bestimmen.

Wie hier geschrieben, gibt es zumindest einen Unterschied bei der Verwendung von fastcgi_index oder fastcgi_split_path_info . Vielleicht gibt es noch mehr ... das weiß ich gerade.

Beispiel

Sie erhalten die Anfrage /info/und haben folgende Konfiguration:

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

SCRIPT_FILENAMEwäre gleich /home/www/scripts/php/info/index.php, aber $request_filenamees wäre einfach /home/www/scripts/php/info/.

Die Konfiguration von fastcgi_split_path_infoist ebenfalls wichtig. Weitere Hilfe finden Sie hier: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

SimonSimCity
quelle
Das scheint nicht zu stimmen (zumindest nicht mehr). Siehe die Antwort von Steely Wing.
Rimas Kudelis
@RimasKudelis Ich habe das schon eine ganze Weile nicht mehr benutzt, aber die Dokumentation hat sich nicht geändert, daher erwarte ich, dass es noch funktioniert - vielleicht müssen Sie etwas fastcgi_split_path_infoändern. Die Antwort von Steely Wing scheint auf Erfahrung zu beruhen, nicht auf der Dokumentation.
SimonSimCity
Ja, und mein Kommentar basiert auch auf Erfahrung. Ich habe versucht fastcgi_split_path_info, mein Alias-Präfix auszuschließen, indem ich es außerhalb der beiden Captures platziert habe, aber es schien keine Wirkung zu haben. Während vorbei $request_filenamewie SCRIPT_FILENAMEwirkt wie ein Zauber, unabhängig davon , ob ein Alias beteiligt ist.
Rimas Kudelis
Eigentlich kann ich nicht verstehen, warum die NginX-Dokumentation sogar vorschlägt, zwei Zeichenfolgen zu verknüpfen, um sie zu bilden SCRIPT_FILENAME, wenn $request_filenameder tatsächliche Dateiname aufgelöst ist, ohne dass irgendwelche Extras angehängt werden. Das obige Beispiel ist tatsächlich falsch, da es $request_filenametatsächlich einen Dateinamen anstelle eines Pfads enthält, selbst wenn diese Datei nicht explizit angefordert wurde. Zumindest ist das mein Fazit von gestern.
Rimas Kudelis
6

TLDR

Ich empfehle die Verwendung $request_filenamefür SCRIPT_FILENAME.


Wenn Sie rootDirektive verwenden

$document_root$fastcgi_script_nameist gleich $request_filename.

Wenn Sie aliasDirektive verwenden

$document_root$fastcgi_script_nameGibt den falschen Pfad zurück, da der $fastcgi_script_namePfad der URL und nicht der Pfad, auf den sich die URL bezieht $document_root.

Beispiel

Wenn du config hast

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

Anfrage /api/testing.php:

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

Anfrage /api/:

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

Und wenn Sie verwenden $request_filename, sollten Sie Index mit indexDirektive festlegen , fastcgi_indexwird nicht funktionieren.

Steely Wing
quelle
2

Ich denke, diese Zeilen wurden aus der 'fastcgi_params'-Datei übernommen.

Grundsätzlich treten keine Fehler auf, SCRIPT_FILENAMEda diese bereits definiert wurden, als Sie Ihre root-Direktive in Ihrer vhost-Datei definiert haben. Wenn Sie es also nicht explizit in Ihrer vhost-Datei mit fastcgi_paramdem Wert von definiert haben, wird es SCRIPT_FILENAMEder root-Direktive entnommen. Aber EIN WICHTIGER PUNKT HIER. Es gibt eine weitere Variable, die Nginx benötigt, um die Anfragen an den PHP-Server zu senden. $fastcgi_script_nameSie muss gut definiert werden, um sich wiederholende URLs und Fehler mit URLs zu vermeiden, die mit Schrägstrichen enden.

Fazit :

Damit alles super funktioniert, sollte jeder SCRIPT_FILENAMEexplizit entweder in der Datei 'fastcgi_params' im Ordner / etc / nginx oder einfach im vhost Ihrer Site im Ordner sites-available definieren, indem er die folgende Zeile in den PHP-Adressblock einfügt:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

oder in der 'fastcgi_params'-Datei enthalten, wie Sie oben geschrieben haben, so oder so. Weitere Informationen zum Verbinden von ngnix mit PHP-FPM finden Sie unter:

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

Ich hoffe, es würde irgendwem in der Zukunft helfen, denn ich habe viel Zeit gebraucht, um es herauszufinden.

Dr.SMS
quelle