मुझे लगता है कि यह स्पष्ट रूप से ध्यान देने योग्य है कि नग्नेक्स उपसर्गों पर काम कर रहा है न कि प्रति फाइलें। पहले मामले में,
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? इसके अलावा, मेरा संपादन देखें - मेरा मतलब एक ही बार में दोनों का उपयोग करना नहीं था। :)