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.

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


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.


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 ..

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.