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

यह चर मौजूदा रूट के लिए फ़ाइल के पथ के बराबर है, जो निर्देशों रूट या उपनाम और URI अनुरोध से बनता है;

$ DOCUMENT_ROOT

यह चर वर्तमान अनुरोध के लिए निर्देश मूल के मूल्य के बराबर है;

$ fastcgi_script_name

यह वैरिएबल URI अनुरोध के बराबर है या, यदि URI आगे ​​स्लैश के साथ समाप्त होता है, तो URI अनुरोध प्लस fastcgi_index द्वारा दिए गए इंडेक्स फ़ाइल का नाम है। PHP में स्क्रिप्ट के नाम का निर्धारण करने के लिए, विशेष रूप से उपयोग किए गए SCRIPT_FILENAME और PATH_TRANSLATED दोनों के स्थान पर इस चर का उपयोग करना संभव है।

जैसा कि यहां लिखा गया है, 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


यह सच नहीं प्रतीत होता है (अब नहीं, कम से कम)। स्टेली विंग द्वारा जवाब देखें।
रिमास कुडेलिस

@RimasKudelis मैंने इसे काफी समय से उपयोग नहीं किया है, लेकिन दस्तावेज़ीकरण नहीं बदला है, इसलिए मुझे उम्मीद है कि यह अभी भी काम करेगा - शायद आपकी fastcgi_split_path_infoआवश्यकताओं के लिए यह एक ट्वीक है। स्टेली विंग द्वारा दिए गए उत्तर को अनुभव पर आधारित प्रतीत होता है, दस्तावेज पर नहीं।
साइमनसिमिटी

हां, और मेरी टिप्पणी भी अनुभव पर आधारित है। मैंने fastcgi_split_path_infoअपने दोनों उपनामों के बाहर रखकर अपने अन्य उपसर्ग को बाहर करने के लिए समायोजन की कोशिश की , लेकिन इसका कोई असर नहीं हुआ। गुजर जबकि $request_filenameके रूप में SCRIPT_FILENAMEएक आकर्षण की तरह काम करता है, या नहीं, एक अन्य नाम शामिल है की परवाह किए बिना।
रिमास कुडेलिस

वास्तव में, मैं यह नहीं समझ पा रहा हूं कि NginX प्रलेखन भी दो स्ट्रिंग्स को SCRIPT_FILENAMEपहले स्थान पर बनाने का सुझाव क्यों देता है, जब $request_filenameवास्तविक फ़ाइल नाम हल होता है, बिना किसी अतिरिक्त के जोड़ा गया है। ऊपर दिया गया उदाहरण वास्तव में गलत है, क्योंकि $request_filenameवास्तव में एक फ़ाइल का नाम केवल एक पथ के विपरीत है, तब भी जब उस फ़ाइल को स्पष्ट रूप से अनुरोध नहीं किया गया था। कम से कम कल के रूप में मेरा निष्कर्ष है।
रिमास कुडेलिस

7

TLDR

मैं के $request_filenameलिए उपयोग की सिफारिश की SCRIPT_FILENAME


यदि आप rootनिर्देश का उपयोग कर रहे हैं

$document_root$fastcgi_script_nameके बराबर है $request_filename

यदि आप aliasनिर्देश का उपयोग कर रहे हैं

$document_root$fastcgi_script_nameगलत रास्ता लौटाएगा, क्योंकि $fastcgi_script_nameURL पथ है, पथ संबंधित नहीं है $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/

मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा क्यूज मुझे यह पता लगाने में बहुत समय लगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.