Я не могу заметить никакой разницы, если в моем файле конфигурации я установил
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Или:
fastcgi_param SCRIPT_FILENAME $request_filename;
Что они делают соответственно? Один из двух лучше другого?
Заранее спасибо.
Вот что говорится в документации:
Эта переменная равна пути к файлу для текущего запроса, сформированного из директив root или alias и URI запроса;
Эта переменная равна значению директивы root для текущего запроса;
Эта переменная равна запросу URI или, если URI завершается косой чертой, то запросу URI плюс имя индексного файла, заданного fastcgi_index. Можно использовать эту переменную вместо SCRIPT_FILENAME и PATH_TRANSLATED, используемых, в частности, для определения имени сценария в PHP.
Как здесь написано, есть как минимум разница при использовании fastcgi_index или fastcgi_split_path_info. Может быть, есть еще ... это то, что я знаю прямо сейчас.
Вы получаете запрос /info/
и иметь следующую конфигурацию:
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
SCRIPT_FILENAME
будет равно /home/www/scripts/php/info/index.php
, но используя $request_filename
это было бы просто /home/www/scripts/php/info/
.
Конфигурация fastcgi_split_path_info
тоже важно. См. Здесь для получения дополнительной помощи: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info
Я рекомендовал использовать $request_filename
для SCRIPT_FILENAME
.
root
директива$document_root$fastcgi_script_name
равно $request_filename
.
alias
директива$document_root$fastcgi_script_name
вернет неправильный путь, потому что $fastcgi_script_name
это путь URL-адреса, а не путь, относящийся к $document_root
.
Если у вас есть конфигурация
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;
}
}
/api/testing.php
:$document_root$fastcgi_script_name
== /app/www//api/testing.php
$request_filename
== /app/www/testing.php
/api/
:$document_root$fastcgi_script_name
== /app/www//api/index.php
$request_filename
== /app/www/index.php
И если вы используете $request_filename
, вы должны установить индекс, используя index
директива fastcgi_index
не будет работать.
Думаю, эти строки были взяты из файла fastcgi_params ..
Обычно вы не получаете никаких ошибок, когда дело доходит до SCRIPT_FILENAME
потому что он уже определен, когда вы определили корневую директиву в своем файле vhost. Поэтому, если вы явно не определили его в своем файле vhost, используя fastcgi_param
значение SCRIPT_FILENAME
будет взят из корневой директивы .. Но ЗДЕСЬ ОДИН ВАЖНЫЙ НОМЕР. Есть еще одна переменная, которая нужна nginx для отправки запросов на php-сервер, который $fastcgi_script_name
и вы должны правильно определить его, чтобы избежать повторяющихся URL-адресов и ошибок с uri, которые заканчиваются косой чертой.
Вывод:
Чтобы все работало очень хорошо, каждый должен определить SCRIPT_FILENAME
явно либо в файле 'fastcgi_params', расположенном в папке / etc / nginx, либо легко в vhost вашего сайта, расположенного в папке sites-available, включив следующую строку в блок местоположения php:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
или включен в файл 'fastcgi_params', как вы написали выше, в любом случае это то же самое .. Для получения дополнительной информации о подключении ngnix к PHP-FPM перейдите по ссылке:
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
Я надеюсь, что это поможет кому-нибудь в будущем, потому что мне потребовалось много времени, чтобы понять это ..