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_FILENAME
byłaby równa /home/www/scripts/php/info/index.php
, ale użycie $request_filename
byłoby po prostu /home/www/scripts/php/info/
.
fastcgi_split_path_info
Waż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
fastcgi_split_path_info
potrzeby wymagają drobnych poprawek . Odpowiedź Steely Wing wydaje się być oparta na doświadczeniu, a nie na dokumentacji.fastcgi_split_path_info
aby wykluczyć mój prefiks aliasu, umieszczając go poza dwoma przechwytywaniami, ale nie wydawało się to mieć żadnego efektu. Natomiast przekazywanie$request_filename
jakoSCRIPT_FILENAME
działa jak urok, niezależnie od tego, czy w grę wchodzi alias.SCRIPT_FILENAME
, gdy$request_filename
zawiera rzeczywistą nazwę pliku rozwiązaną, bez żadnych dodatków. Powyższy przykład jest w rzeczywistości niepoprawny, ponieważ$request_filename
w 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.TLDR
Polecam użyć
$request_filename
dlaSCRIPT_FILENAME
.Jeśli korzystasz z
root
dyrektywy$document_root$fastcgi_script_name
jest równy$request_filename
.Jeśli korzystasz z
alias
dyrektywy$document_root$fastcgi_script_name
zwróci niewłaściwą ścieżkę, ponieważ$fastcgi_script_name
jest to ścieżka do adresu URL, a nie ścieżka, do której się odnosi$document_root
.Przykład
Jeśli masz konfigurację
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ąindex
dyrektywy,fastcgi_index
nie będzie działać.źródło
Sądzę, że te linie zostały zaczerpnięte z pliku „fastcgi_params”.
Zasadniczo nie pojawia się żaden błąd,
SCRIPT_FILENAME
ponieważ jest już zdefiniowany, gdy zdefiniowano dyrektywę root w pliku vhost. Więc jeśli nie zdefiniowałeś go wprost w pliku vhost, użyciefastcgi_param
wartościSCRIPT_FILENAME
był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_name
musisz, 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_FILENAME
wyraź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: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źć.
źródło