Nginx $ document_root $ fastcgi_script_name so với $ request_filename


15

Tôi không thể nhận thấy bất kỳ sự khác biệt nếu trong tập tin cấu hình của tôi, tôi đặt

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Hoặc là:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

Họ làm gì tương ứng? Là một trong hai tốt hơn so với người kia?

Cảm ơn trước.

Câu trả lời:


24

Đây là những gì tài liệu nói:

$ request_filename

Biến này bằng với đường dẫn đến tệp cho yêu cầu hiện tại, được hình thành từ lệnh gốc hoặc bí danh và yêu cầu URI;

$ document_root

Biến này bằng với giá trị của lệnh gốc cho yêu cầu hiện tại;

$ fastcgi_script_name

Biến này bằng với yêu cầu URI hoặc, nếu nếu URI kết thúc bằng dấu gạch chéo về phía trước, thì yêu cầu URI cộng với tên của tệp chỉ mục được cung cấp bởi fastcgi_index. Có thể sử dụng biến này thay cho cả SCRIPT_FILENAME và PATH_TRANSLATED, đặc biệt, được sử dụng để xác định tên của tập lệnh trong PHP.

Như được viết ở đây, có ít nhất một sự khác biệt khi sử dụng fastcgi_index hoặc fastcgi_split_path_info . Có lẽ có nhiều ... đó là những gì tôi biết ngay bây giờ.

Thí dụ

Bạn nhận được yêu cầu /info/và có cấu hình sau:

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

SCRIPT_FILENAMEsẽ bằng /home/www/scripts/php/info/index.php, nhưng sử dụng $request_filenamenó sẽ chỉ là /home/www/scripts/php/info/.

Cấu hình của fastcgi_split_path_infocũng quan trọng. Xem tại đây để được trợ giúp thêm: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info


Điều này dường như không đúng (ít nhất là không còn nữa). Xem câu trả lời của Steely Wing.
Rimas Kudelis

@RimasKudelis Tôi đã không sử dụng điều này trong một thời gian dài, nhưng tài liệu đã không thay đổi, vì vậy tôi hy vọng nó vẫn hoạt động - có thể bạn fastcgi_split_path_infocần một điều chỉnh. Câu trả lời của Steely Wing dường như dựa trên kinh nghiệm, không dựa trên tài liệu.
SimonSimCity

vâng, và nhận xét của tôi cũng dựa trên kinh nghiệm. Tôi đã cố gắng điều chỉnh fastcgi_split_path_infođể loại trừ tiền tố bí danh của mình bằng cách đặt nó bên ngoài hai lần chụp, nhưng dường như nó không có tác dụng gì. Trong khi đi qua $request_filenamenhư SCRIPT_FILENAMEcông trình như một say mê, bất kể có hay không một bí danh có liên quan.
Rimas Kudelis

Trên thực tế, tôi không thể hiểu tại sao tài liệu NginX thậm chí còn đề nghị nối hai chuỗi để tạo thành SCRIPT_FILENAMEở vị trí đầu tiên, khi $request_filenamechứa tên tệp thực tế được giải quyết, mà không có bất kỳ bổ sung nào được nối thêm. Ví dụ trên thực sự không chính xác, vì $request_filenametrên thực tế có chứa một tên tệp trái ngược với chỉ một đường dẫn, ngay cả khi tệp đó không được yêu cầu rõ ràng. Ít nhất đó là kết luận của tôi như ngày hôm qua.
Rimas Kudelis

6

TLD

Tôi khuyên bạn nên sử dụng $request_filenamecho SCRIPT_FILENAME.


Nếu bạn sử dụng rootchỉ thị

$document_root$fastcgi_script_namebằng $request_filename.

Nếu bạn sử dụng aliaschỉ thị

$document_root$fastcgi_script_namesẽ trả về đường dẫn sai, vì $fastcgi_script_namelà đường dẫn của URL chứ không phải đường dẫn liên quan đến $document_root.

Thí dụ

Nếu bạn có cấu hình

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

Yêu cầu /api/testing.php:

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

Yêu cầu /api/:

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

Và nếu bạn sử dụng $request_filename, bạn nên đặt chỉ mục bằng cách sử dụng lệnh index, fastcgi_indexsẽ không hoạt động.


2

Tôi đoán những dòng đó được lấy từ tệp 'fastcgi_params' ..

Về cơ bản, bạn không gặp phải bất kỳ lỗi nào khi nói đến SCRIPT_FILENAMEvì nó đã được xác định khi bạn xác định lệnh gốc trong tệp vhost của mình. Vì vậy, trừ khi bạn xác định rõ ràng trong tệp vhost của mình bằng cách sử dụng fastcgi_paramgiá trị của SCRIPT_FILENAMEsẽ được lấy từ chỉ thị gốc .. Nhưng MỘT ĐIỂM QUAN TRỌNG TẠI ĐÂY. Có một biến khác mà nginx cần để gửi các yêu cầu đến máy chủ php, $fastcgi_script_namevà bạn phải xác định rõ nó để tránh các URL và lỗi lặp đi lặp lại với dấu gạch chéo kết thúc bằng dấu gạch chéo.

Kết luận :

Để làm cho mọi thứ hoạt động tốt, mọi người nên xác định SCRIPT_FILENAMErõ ràng trong tệp 'fastcgi_params' nằm trong thư mục / etc / nginx hoặc dễ dàng trong vhost của trang web của bạn nằm trong thư mục có sẵn của trang bằng cách đưa dòng sau vào khối vị trí php:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

hoặc được bao gồm trong tệp 'fastcgi_params' như bạn đã viết ở trên, dù bằng cách nào thì cũng vậy .. Để biết thêm thông tin để kết nối ngnix với PHP-FPM, hãy truy cập:

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

Tôi hy vọng nó sẽ giúp được bất cứ ai trong tương lai 'vì tôi đã mất rất nhiều thời gian để tìm ra nó ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.