Назад | Перейти на главную страницу

Nginx $ document_root $ fastcgi_script_name vs $ request_filename

Я не могу заметить никакой разницы, если в моем файле конфигурации я установил

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Или:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Что они делают соответственно? Один из двух лучше другого?

Заранее спасибо.

Вот что говорится в документации:

$ request_filename

Эта переменная равна пути к файлу для текущего запроса, сформированного из директив root или alias и URI запроса;

$ document_root

Эта переменная равна значению директивы root для текущего запроса;

$ fastcgi_script_name

Эта переменная равна запросу 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

TL; DR

Я рекомендовал использовать $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/

Я надеюсь, что это поможет кому-нибудь в будущем, потому что мне потребовалось много времени, чтобы понять это ..