Nginx $ katalog_główny_dokumentu $ fastcgi_script_name vs $ nazwa_pliku żądania

16

Nie widzę żadnej różnicy, jeśli ustawię w pliku konfiguracyjnym

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Lub:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Co oni odpowiednio robią? Czy jeden z nich jest lepszy od drugiego?

Z góry dziękuję.

MultiformeIngegno
źródło

Odpowiedzi:

24

Oto, co mówi dokumentacja:

$ nazwa_pliku żądania

Ta zmienna jest równa ścieżce do pliku dla bieżącego żądania, utworzonego z dyrektyw root lub aliasu i żądania URI;

$ katalog_główny dokumentu

Ta zmienna jest równa wartości katalogu głównego dyrektywy dla bieżącego żądania;

$ fastcgi_script_name

Ta zmienna jest równa żądaniu URI lub, jeśli URI kończy się ukośnikiem, żądanie URI plus nazwa pliku indeksu podana przez fastcgi_index. Możliwe jest użycie tej zmiennej zamiast zarówno SCRIPT_FILENAME, jak i PATH_TRANSLATED, wykorzystywanych w szczególności do określania nazwy skryptu w PHP.

Jak napisano tutaj, istnieje co najmniej różnica w korzystaniu z fastcgi_index lub fastcgi_split_path_info . Może jest ich więcej ... o tym teraz wiem.

Przykład

Otrzymujesz żądanie /info/i masz następującą konfigurację:

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

SCRIPT_FILENAMEbyłaby równa /home/www/scripts/php/info/index.php, ale użycie $request_filenamebyłoby po prostu /home/www/scripts/php/info/.

fastcgi_split_path_infoWażna jest również konfiguracja . Zobacz tutaj, aby uzyskać dalszą pomoc: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

SimonSimCity
źródło
Nie wydaje się to prawdą (przynajmniej już nie). Zobacz odpowiedź Steely Wing.
Rimas Kudelis,
@RimasKudelis Nie używałem tego od dłuższego czasu, ale dokumentacja się nie zmieniła, więc spodziewam się, że nadal będzie działać - być może twoje fastcgi_split_path_infopotrzeby wymagają drobnych poprawek . Odpowiedź Steely Wing wydaje się być oparta na doświadczeniu, a nie na dokumentacji.
SimonSimCity,
tak, a mój komentarz opiera się również na doświadczeniu. Próbowałem dostosować, fastcgi_split_path_infoaby wykluczyć mój prefiks aliasu, umieszczając go poza dwoma przechwytywaniami, ale nie wydawało się to mieć żadnego efektu. Natomiast przekazywanie $request_filenamejako SCRIPT_FILENAMEdziała jak urok, niezależnie od tego, czy w grę wchodzi alias.
Rimas Kudelis,
W rzeczywistości nie rozumiem, dlaczego dokumentacja NginX sugeruje nawet połączenie dwóch łańcuchów w celu utworzenia SCRIPT_FILENAME, gdy $request_filenamezawiera rzeczywistą nazwę pliku rozwiązaną, bez żadnych dodatków. Powyższy przykład jest w rzeczywistości niepoprawny, ponieważ $request_filenamew rzeczywistości zawiera nazwę pliku, a nie tylko ścieżkę, nawet jeśli plik ten nie został wyraźnie zażądany. Przynajmniej taki jest mój wniosek z wczoraj.
Rimas Kudelis,
7

TLDR

Polecam użyć $request_filenamedla SCRIPT_FILENAME.


Jeśli korzystasz z rootdyrektywy

$document_root$fastcgi_script_namejest równy $request_filename.

Jeśli korzystasz z aliasdyrektywy

$document_root$fastcgi_script_namezwróci niewłaściwą ścieżkę, ponieważ $fastcgi_script_namejest to ścieżka do adresu URL, a nie ścieżka, do której się odnosi $document_root.

Przykład

Jeśli masz konfigurację

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

Zapytanie /api/testing.php:

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

Zapytanie /api/:

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

A jeśli używasz $request_filename, powinieneś ustawić indeks za pomocą indexdyrektywy, fastcgi_indexnie będzie działać.

Steely Wing
źródło
2

Sądzę, że te linie zostały zaczerpnięte z pliku „fastcgi_params”.

Zasadniczo nie pojawia się żaden błąd, SCRIPT_FILENAMEponieważ jest już zdefiniowany, gdy zdefiniowano dyrektywę root w pliku vhost. Więc jeśli nie zdefiniowałeś go wprost w pliku vhost, użycie fastcgi_paramwartości SCRIPT_FILENAMEbyłoby wzięte z dyrektywy root. Ale JEDEN WAŻNY PUNKT TUTAJ. Jest jeszcze jedna zmienna, której potrzebuje nginx, aby wysyłać żądania do serwera php, którą $fastcgi_script_namemusisz, i musisz ją dobrze zdefiniować, aby uniknąć powtarzających się adresów URL i błędów w identyfikatorach URI zakończonych ukośnikiem.

Wniosek :

Aby wszystko działało super przyjemnie, każdy powinien SCRIPT_FILENAMEwyraźnie zdefiniować albo w pliku „fastcgi_params” znajdującym się w folderze / etc / nginx, albo łatwo w vhostie swojej witryny znajdującej się w folderze dostępnym na stronach, włączając następujący wiersz w bloku lokalizacji php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

lub zawarte w pliku „fastcgi_params”, jak napisałeś powyżej, tak czy inaczej, to samo. Aby uzyskać więcej informacji na temat podłączania ngnix do PHP-FPM, przejdź do:

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

Mam nadzieję, że to pomoże komukolwiek w przyszłości, ponieważ zajęło mi to dużo czasu, aby to rozgryźć.

Dr.SMS
źródło