Nginx $ document_root $ fastcgi_script_name против $ request_filename

16

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

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Или:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

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

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

MultiformeIngegno
источник

Ответы:

24

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

$ 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

SimonSimCity
источник
Это не похоже на правду (по крайней мере, больше). Смотрите ответ Steely Wing.
Римас Куделис
@RimasKudelis Я давно этим не пользовался, но документация не изменилась, поэтому я ожидаю, что она все еще будет работать - возможно, вам fastcgi_split_path_infoнужно настроить. Ответ Steely Wing, похоже, основан на опыте, а не на документации.
SimonSimCity
да, и мой комментарий также основан на опыте. Я попытался откорректировать, fastcgi_split_path_infoчтобы исключить мой префикс псевдонима, поместив его за пределы двух снимков, но, похоже, это не имело никакого эффекта. Принимая во внимание , проходя , $request_filenameкак SCRIPT_FILENAMEработает как шарм, независимо от того , или не участвует псевдоним.
Римас Куделис
На самом деле, я не могу понять, почему документация NginX даже предлагает объединить две строки, чтобы сформировать SCRIPT_FILENAMEв первую очередь, когда $request_filenameсодержит фактическое разрешенное имя файла, без каких-либо дополнительных дополнений. Приведенный выше пример на самом деле неверен, поскольку $request_filenameна самом деле содержит имя файла, а не просто путь, даже если этот файл явно не запрашивался. По крайней мере, это мой вывод от вчерашнего дня.
Римас Куделис
7

TLDR

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

Steely Wing
источник
2

Я думаю, что эти строки были взяты из файла '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 location:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

или включены в файл 'fastcgi_params', как вы написали выше, в любом случае это одно и то же. Для получения дополнительной информации о подключении ngnix к PHP-FPM перейдите по ссылке:

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

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

Dr.SMS
источник