Nginx - रूट बनाम उर्फ, एकल फ़ाइलों की सेवा के लिए?


66

कई घंटों के बाद nginxएकल फ़ाइलों की सेवा करने के लिए जैसे robots.txt(संकेत: हर बार अपने ब्राउज़र कैश को साफ़ करें ), मैं दो अलग-अलग तरीकों से घाव करता हूं, एक अलियास निर्देश का उपयोग करता है , और एक मूल निर्देश का उपयोग करके , जैसे:

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

क्या दोनों के बीच कोई कार्यात्मक अंतर है? या सुरक्षा के मुद्दे? अन्य निर्देशों के साथ कोई संघर्ष? (दोनों एक अन्य / स्थिर स्थान के साथ ठीक लग रहे थे)। या किसी एक को दूसरे पर लेने का कोई कारण?

नोट - मैंने एक ही समय में दोनों का उपयोग नहीं किया :) बल्कि मैंने प्रत्येक की कोशिश की, एक समय में, और दोनों ने काम किया। मैं यह नहीं पूछ रहा कि वे दोनों एक ही फ़ाइल में एक साथ कैसे बातचीत करते हैं, लेकिन कौन सा उपयोग करना बेहतर होगा।

जवाबों:


71

खैर, ये दोनों निर्देश थोड़े अलग हैं क्योंकि आप बाद के मामले में सटीक मिलान का उपयोग नहीं करते हैं। तो, /robots.txt1111अपने दूसरे स्थान से भी मेल खाएगा।
location =/robots.txt { root /home/www/static/; }आपके पहले निर्देश के बराबर एक सटीक कार्यात्मक है।


अच्छी बात है, धन्यवाद। लेकिन आप =दोनों मामलों में, सही का उपयोग कर सकते हैं ? या यह केवल पर लागू होता है root? इसके अलावा, मेरा संपादन देखें - मेरा मतलब एक ही बार में दोनों का उपयोग करना नहीं था। :)
साइक्लोप्स

@ चक्रवात हाँ, आप =दोनों मामलों में उपयोग कर सकते हैं ।
अलेक्जेंडर अजरोव

तो वे एक ही होंगे - क्या एक निर्देश को दूसरे पर लेने का कोई कारण है? मेरा मुख्य प्रश्न है।
साइक्लोप्स

@ चक्रवात मूल रूप से, ऐसा कोई कारण नहीं है।
एलेक्स

41

हां, एक अंतर है: "उर्फ" के साथ आप कर सकते हैं .. एक और फ़ाइल नाम की तरह उर्फ, जैसे

location /robots.txt { alias /home/www/static/any-filename.txt; }

जहाँ तक

location /robots.txt { root /home/www/static/; }

आपको सर्वर पर अपनी फ़ाइल को भी नाम देने के लिए मजबूर करता है। जब से मैं अपने सर्वर पर tld.domain.subdomain-robots.txt के रूप में अपनी रोबोट फ़ाइलों को नाम देना चाहता हूं, तब से मैं पहले विकल्प का उपयोग करता हूं; जैसे

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

1

मुझे लगता है कि यह स्पष्ट रूप से ध्यान देने योग्य है कि नग्नेक्स उपसर्गों पर काम कर रहा है न कि प्रति फाइलें। पहले मामले में,

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उपयोग किया जा सकता है , वहां बाधाएं हैं ।


0

एक अंतर है, जब उपनाम पूरी निर्देशिका के लिए है।

    location ^~ /data/ { alias /home/www/static/data/; }

काम करेंगे, जबकि

    location ^~ /data/ { root /home/www/static/data/; }

नहीं करेंगे यह होना ही होगा

    location ^~ /data/ { root /home/www/static/; }

(भ्रमित करने के लिए आसान)

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