Nginx $ document_root $ fastcgi_script_name vs $ request_filename


16

Я не можу помітити різниці, якщо в своєму конфігураційному файлі я встановив

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Або:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Що вони роблять відповідно? Чи одна з двох краща за іншу?

Заздалегідь спасибі.

Відповіді:


24

Ось що говорить документація:

$ request_filename

Ця змінна дорівнює шляху до файлу для поточного запиту, сформованого з кореня директив або псевдоніму та запиту URI;

$ document_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


Це, мабуть, не відповідає дійсності (щонайменше, не менше). Дивіться відповідь Стілі Вінг.
Rimas Kudelis

@RimasKudelis Я цим не користувався досить давно, але документація не змінилася, тому я очікую, що вона все-таки спрацює - можливо, вам fastcgi_split_path_infoпотрібна настройка. Відповідь Стілі Вінг, здається, грунтується лише на досвіді, а не на документації.
SimonSimCity

так, і мій коментар також ґрунтується на досвіді. Я спробував налаштувати, fastcgi_split_path_infoщоб виключити свій префікс псевдоніму, поставивши його поза двома захопленнями, але, схоже, це не мало жодного ефекту. Беручи під увагу , проходячи , $request_filenameяк SCRIPT_FILENAMEпрацює як шарм, незалежно від того , чи не бере псевдонім.
Rimas Kudelis

Насправді, я не можу зрозуміти, чому документація NginX навіть пропонує об'єднати два рядки для формування SCRIPT_FILENAMEв першу чергу, коли $request_filenameміститься фактичне вирішене ім’я файлу, без додавання додатків. Наведений вище приклад насправді є невірним, оскільки $request_filenameнасправді містить ім'я файлу, а не просто шлях, навіть коли цей файл не запитувався явно. Принаймні, це мій висновок станом на вчора.
Rimas Kudelis

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не буде працювати.


2

Я думаю, що ці рядки були взяті з файлу 'fastcgi_params' ..

В основному ви не отримуєте жодних помилок, коли це стосується, SCRIPT_FILENAMEоскільки це вже визначено, коли ви визначали свою кореневу директиву у своєму файлі vhost. Тож, якщо ви чітко не визначили це у вашому файлі vhost, використовуючи fastcgi_paramзначення, SCRIPT_FILENAMEбуло б взяте з кореневої директиви. Є ще одна змінна, яка потрібна nginx для того, щоб надсилати запити на сервер php, який є, $fastcgi_script_nameі ви повинні це добре визначити, щоб уникнути повторюваних URL-адрес та помилок з урі, які закінчуються косою рисою.

Висновок :

Щоб все працювало надзвичайно приємно, кожен повинен SCRIPT_FILENAMEчітко визначитись у файлі 'fastcgi_params', який знаходиться в папці / etc / nginx, або легко у vhost вашого сайту, що знаходиться у доступній для сайтів папці, включивши наступний рядок у блок розташування 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/

Я сподіваюся, що це допоможе комусь у майбутньому, тому що мені знадобилося багато часу, щоб зрозуміти це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.