Nginx $ document_root $ fastcgi_script_name เทียบกับ $ request_filename


16

ฉันไม่สามารถสังเกตเห็นความแตกต่างใด ๆ หากอยู่ในไฟล์ปรับแต่งของฉัน

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

หรือ:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

พวกเขาทำอะไรตามลำดับ เป็นหนึ่งในสองที่ดีกว่าอีกหรือไม่

ขอบคุณล่วงหน้า.

คำตอบ:


24

นี่คือสิ่งที่เอกสารอธิบายว่า:

$ request_filename

ตัวแปรนี้เท่ากับพา ธ ไปยังไฟล์สำหรับคำขอปัจจุบันที่เกิดขึ้นจากคำสั่ง root หรือนามแฝงและคำขอ 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


ดูเหมือนจะไม่เป็นความจริง (อย่างน้อยก็อีกต่อไป) ดูคำตอบของ Steely Wing
Rimas Kudelis

@RimasKudelis ฉันไม่ได้ใช้มันมาระยะหนึ่งแล้ว แต่เอกสารไม่ได้เปลี่ยนดังนั้นฉันคาดหวังว่ามันจะยังคงใช้งานได้ - บางทีคุณอาจfastcgi_split_path_infoต้องปรับแต่ง คำตอบของ Steely Wing ดูเหมือนจะขึ้นอยู่กับประสบการณ์อย่างมากไม่ใช่ในเอกสารประกอบ
SimonSimCity

ใช่และความคิดเห็นของฉันก็ขึ้นอยู่กับประสบการณ์ ฉันพยายามปรับfastcgi_split_path_infoเพื่อยกเว้นคำนำหน้านามแฝงของฉันโดยวางไว้นอกการจับสองครั้ง แต่ดูเหมือนจะไม่มีผลใด ๆ ในขณะที่การส่งผ่าน$request_filenameเป็นSCRIPT_FILENAMEผลงานเช่นเสน่ห์โดยไม่คำนึงถึงหรือไม่ว่านามแฝงมีส่วนเกี่ยวข้อง
Rimas Kudelis

ที่จริงแล้วฉันไม่สามารถเข้าใจได้ว่าทำไมเอกสารประกอบของ NginX ถึงแนะนำให้ทำการเชื่อมโยงสองสายเข้าด้วยกันSCRIPT_FILENAMEในรูปแบบแรกเมื่อ$request_filenameมีการแก้ไขชื่อไฟล์จริงโดยไม่ต้องต่อท้าย ตัวอย่างข้างต้นไม่ถูกต้องจริง ๆ แล้วเนื่องจาก$request_filenameในความเป็นจริงจะมีชื่อไฟล์ซึ่งตรงข้ามกับเส้นทางแม้ว่าจะไม่ได้ร้องขอไฟล์อย่างชัดเจนก็ตาม อย่างน้อยนั่นเป็นข้อสรุปของฉันเมื่อวานนี้
Rimas Kudelis

7

TLDR

ผมแนะนำให้ใช้สำหรับ$request_filenameSCRIPT_FILENAME


หากคุณใช้rootคำสั่ง

$document_root$fastcgi_script_name$request_filenameจะมีค่าเท่ากับ

หากคุณใช้aliasคำสั่ง

$document_root$fastcgi_script_nameจะกลับเส้นทางที่ผิดเพราะ$fastcgi_script_nameเป็นเส้นทางของ URL $document_rootที่ไม่ได้เส้นทางที่เกี่ยวข้องกับ

ตัวอย่าง

หากคุณมี config

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 ซ้ำและข้อผิดพลาดด้วย uri ที่ลงท้ายด้วยเครื่องหมายทับ

สรุป :

เพื่อให้ทุกอย่างใช้งานได้ดีสุด ๆ ทุกคนควรกำหนด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/

ฉันหวังว่ามันจะช่วยให้ทุกคนในอนาคต 'เพราะมันใช้เวลามากในการคิดออก ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.