Nginx $ document_root $ fastcgi_script_name vs $ request_filename

16

Saya tidak dapat melihat perbedaan jika di file konfigurasi saya atur

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Atau:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Apa yang mereka lakukan masing-masing? Apakah salah satu dari keduanya lebih baik dari yang lain?

Terima kasih sebelumnya.

MultiformeIngegno
sumber

Jawaban:

24

Inilah yang dikatakan dalam dokumentasi:

$ request_filename

Variabel ini sama dengan path ke file untuk permintaan saat ini, dibentuk dari arahan arahan atau alias dan permintaan URI;

$ document_root

Variabel ini sama dengan nilai root direktif untuk permintaan saat ini;

$ fastcgi_script_name

Variabel ini sama dengan permintaan URI atau, jika jika URI diakhiri dengan garis miring, maka permintaan URI ditambah nama file indeks yang diberikan oleh fastcgi_index. Dimungkinkan untuk menggunakan variabel ini sebagai pengganti SCRIPT_FILENAME dan PATH_TRANSLATED, digunakan, khususnya, untuk menentukan nama skrip dalam PHP.

Seperti yang ditulis di sini, setidaknya ada perbedaan ketika menggunakan fastcgi_index atau fastcgi_split_path_info . Mungkin ada lagi ... itu yang saya tahu sekarang.

Contoh

Anda mendapatkan permintaan /info/dan memiliki konfigurasi berikut:

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAMEakan sama /home/www/scripts/php/info/index.php, tetapi menggunakannya $request_filenamehanya akan /home/www/scripts/php/info/.

Konfigurasi fastcgi_split_path_infojuga penting. Lihat di sini untuk bantuan lebih lanjut: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

SimonSimCity
sumber
Ini sepertinya tidak benar (tidak lagi, setidaknya). Lihat jawabannya oleh Steely Wing.
Rimas Kudelis
@RimasKudelis Saya sudah lama tidak menggunakan ini, tetapi dokumentasi belum berubah, jadi saya berharap masih berfungsi - mungkin Anda fastcgi_split_path_infoperlu mengubah. Jawaban Steely Wing tampaknya sangat didasarkan pada pengalaman, bukan pada dokumentasi.
SimonSimCity
ya, dan komentar saya juga berdasarkan pengalaman. Saya mencoba menyesuaikan fastcgi_split_path_infountuk mengecualikan awalan alias saya dengan meletakkannya di luar dua tangkapan, tetapi tampaknya tidak berpengaruh. Sedangkan lewat $request_filenamesebagai SCRIPT_FILENAMEkarya seperti pesona, terlepas dari apakah alias terlibat atau tidak.
Rimas Kudelis
Sebenarnya, saya tidak bisa mengerti mengapa dokumentasi NginX bahkan menyarankan untuk menggabungkan dua string untuk membentuk SCRIPT_FILENAMEdi tempat, ketika $request_filenameberisi nama file aktual diselesaikan, tanpa tambahan ditambahkan. Contoh di atas sebenarnya salah, karena $request_filenamesebenarnya memang berisi nama file yang bertentangan dengan hanya path, bahkan ketika file itu tidak diminta secara eksplisit. Setidaknya itulah kesimpulan saya sampai kemarin.
Rimas Kudelis
7

TLDR

Saya merekomendasikan penggunaan $request_filenameuntuk SCRIPT_FILENAME.


Jika Anda menggunakan rootarahan

$document_root$fastcgi_script_namesama dengan $request_filename.

Jika Anda menggunakan aliasarahan

$document_root$fastcgi_script_nameakan mengembalikan jalur yang salah, karena $fastcgi_script_namejalur URL, bukan jalur yang terkait $document_root.

Contoh

Jika Anda memiliki konfigurasi

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;
    }
}

Minta /api/testing.php:

  • $document_root$fastcgi_script_name == /app/www//api/testing.php
  • $request_filename == /app/www/testing.php

Minta /api/:

  • $document_root$fastcgi_script_name == /app/www//api/index.php
  • $request_filename == /app/www/index.php

Dan jika Anda menggunakan $request_filename, Anda harus mengatur indeks menggunakan indexarahan, fastcgi_indextidak akan berfungsi.

Steely Wing
sumber
2

Saya kira kalimat itu diambil dari file 'fastcgi_params' ..

Pada dasarnya Anda tidak mendapatkan kesalahan apa pun SCRIPT_FILENAMEkarena itu sudah ditentukan ketika Anda mendefinisikan direktif root Anda di file vhost Anda. Jadi kecuali Anda mendefinisikannya secara eksplisit dalam file vhost Anda menggunakan fastcgi_paramnilai SCRIPT_FILENAMEakan diambil dari direktif root .. Tapi SATU TITIK PENTING DI SINI. Ada variabel lain yang dibutuhkan nginx untuk mengirim permintaan ke server php yang ada $fastcgi_script_namedan Anda harus mendefinisikannya dengan baik untuk menghindari URL berulang dan kesalahan dengan uri's yang diakhiri dengan slash.

Kesimpulan :

Agar semuanya berfungsi dengan sangat baik, semua orang harus mendefinisikan SCRIPT_FILENAMEsecara eksplisit baik dalam file 'fastcgi_params' yang terletak di folder / etc / nginx atau dengan mudah di vhost situs Anda yang terletak di folder yang tersedia situs dengan memasukkan baris berikut di blok lokasi php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

atau termasuk dalam file 'fastcgi_params' seperti yang Anda tulis di atas, baik itu sama .. Untuk info lebih lanjut untuk menghubungkan ngnix ke PHP-FPM, buka:

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

Saya harap ini akan membantu siapa pun di masa depan karena butuh banyak waktu untuk mencari tahu ..

Dr.SMS
sumber