मुझे लगता है कि यह स्पष्ट रूप से ध्यान देने योग्य है कि नग्नेक्स उपसर्गों पर काम कर रहा है न कि प्रति फाइलें। पहले मामले में,
location /robots.txt { alias /home/www/static/robots.txt; }
nginx URL पथ में स्ट्रिंग उपसर्ग की जगह लेता है और फिर फ़ाइल सिस्टम पथ के रूप में परिणाम का उपयोग करता है। छद्मकोड के रूप में प्रस्तुत, यह कुछ इस तरह होगा:/robots.txt
/home/www/static/robots.txt
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
तो /robots.txt
से परोसा जाता है /home/www/static/robots.txt
क्योंकि /robots.txt
छीन /robots.txt
उपसर्ग रिक्त स्ट्रिंग है, और करने के लिए रिक्त स्ट्रिंग जोड़कर /home/www/static/robots.txt
यह अपरिवर्तित छोड़ देता है। लेकिन, /robots.txt1
से परोसा जाएगा /home/www/static/robots.txt1
और /robots.txt/foobar
से परोसा जाएगा /home/www/static/robots.txt/foobar
। वे फाइलें मौजूद नहीं हो सकती हैं, जिससे nginx को 404 प्रतिसाद भेजा जा सकता है, और यह संभावना है कि robots.txt
वैसे भी एक निर्देशिका नहीं है, लेकिन nginx को यह पहले से पता नहीं है, और यह सब स्ट्रिंग उपसर्गों पर आधारित है और न कि एक फ़ाइल प्रतीत होती है या अनुगामी स्लेश की अनुपस्थिति या उपस्थिति द्वारा निर्देशिका।
जबकि, दूसरे मामले में,
location /robots.txt { root /home/www/static/; }
nginx /home/www/static/
URL पथ की शुरुआत में स्ट्रिंग सम्मिलित करता है और फिर फ़ाइल सिस्टम पथ के रूप में परिणाम का उपयोग करता है। स्यूडोकोड में, यह कुछ इस तरह होगा:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
यह पहले मामले के समान सटीक परिणाम है, लेकिन एक अलग कारण के लिए। कोई उपसर्ग स्ट्रिपिंग नहीं है, लेकिन चूंकि प्रत्येक यूआरआई पथ में उपसर्ग शामिल है /robots.txt
, तो फ़ाइल सिस्टम पथ हमेशा उसी के साथ शुरू होगा /home/www/static//robots.txt
जिसके बराबर है /home/www/static/robots.txt
।
बेशक, pseudocode पूरी कहानी नहीं बताता है, जैसे कि nginx नेत्रहीन कच्चे URL पथों का उपयोग नहीं करेगा /../../../etc/passwd
, जैसे try_files
निर्देश root
/ के व्यवहार को बदल देता है alias
, और जहां alias
उपयोग किया जा सकता है , वहां बाधाएं हैं ।
=
दोनों मामलों में, सही का उपयोग कर सकते हैं ? या यह केवल पर लागू होता हैroot
? इसके अलावा, मेरा संपादन देखें - मेरा मतलब एक ही बार में दोनों का उपयोग करना नहीं था। :)