निर्देशिका और उप-विभाजकों तक पहुँच को कैसे प्रतिबंधित करें


42

मुझे direstory "testdir" में किसी भी फाइल या सबडिर के एक्सेस को प्रतिबंधित करने की आवश्यकता है। मेरा आत्मविश्वास:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

मेरे कॉन्फ़िगरेशन में मुझे / testdir / jpg_or_txt-files पर कोई प्रतिबंध नहीं है। यह कैसे करना है?


ध्यान दें, मेरे अनुभव में, लिनक्स पर नग्नेक्स चलाते समय स्थान फ़ंक्शन केवल ठीक से काम करता है। खिड़कियों पर दौड़ते समय, हमें काम नहीं करने से परेशानी हुई ...
संस्मिथ

जवाबों:


43

एक स्थान प्रविष्टि में nginx में कई निर्देशिकाओं तक पहुंच को प्रतिबंधित करना

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

7
आपको ४०३ नहीं बल्कि ४०४ लौटाने चाहिए।
स्टिलमैटिक

12
इस सवाल का जवाब बिल्कुल नहीं है।

1
403 लौटाना एक संकेत देता है कि फ़ोल्डर मौजूद है, एक 404 फ़ोल्डर के सभी में मौजूद सबूत का कोई सबूत नहीं देता है
डॉन विल्सन

23

ऐसा इसलिए है क्योंकि "इनकार" निर्देश से पहले "रूट" निर्देश मैच हो सकता है। अपने निर्देशों के क्रम को उलट दें और यह काम करना चाहिए:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

16

यह सुनिश्चित करने के लिए कि jpg / txt मैच के बजाय टेस्टडेयर मैच चुना गया है, निम्नलिखित स्थानों का उपयोग करें:

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

आपके उदाहरण में, आपके पास दो प्रकार के स्थान हैं। location /testdirएक उपसर्ग स्थान है, क्योंकि इसके ~बीच कोई टिल्ड ( ) नहीं है locationऔर /testdir

location ~* ^.+\.(jpg|txt)$एक रेगेक्स स्थान (एक मामला-असंवेदनशील है, *सीधे टिल्ड के कारण)। से nginx प्रलेखन :

दिए गए अनुरोध के मिलान वाले स्थान को खोजने के लिए, nginx पहले उपसर्ग स्ट्रिंग्स (उपसर्ग स्थानों) का उपयोग करके परिभाषित स्थानों की जांच करता है। उनमें से, सबसे लंबे मिलान वाले उपसर्ग के साथ स्थान का चयन और याद किया जाता है। फिर कॉन्फ़िगरेशन फ़ाइल में उनकी उपस्थिति के क्रम में नियमित अभिव्यक्ति की जांच की जाती है। नियमित अभिव्यक्तियों की खोज पहले मैच पर समाप्त होती है, और संबंधित कॉन्फ़िगरेशन का उपयोग किया जाता है। यदि नियमित अभिव्यक्ति के साथ कोई मेल नहीं मिलता है, तो पहले याद किए गए उपसर्ग स्थान के कॉन्फ़िगरेशन का उपयोग किया जाता है।

यहाँ समस्या यह है कि आपके टेस्टडिर स्थान को याद किया जा रहा है, लेकिन फिर jpg / txt स्थान को रेगेक्स चरण के दौरान चुना जाता है, क्योंकि यह मेल खाता है। प्रलेखन से निम्नलिखित नोट मैं अपने समाधान पर आधारित है (ऊपर दिया गया है):

यदि सबसे लंबे मिलान वाले उपसर्ग स्थान में "^ ~" संशोधक है तो नियमित अभिव्यक्तियों की जाँच नहीं की जाती है।


11
location /foo {
    deny all;
    return 404;
}

यह आपको इनकार के कारण हर समय 403 देगा। जब आप चाहते हैं कि सर्वर आपको 404 दे दे तो केवल 404 ही लौटाएं ... जैसे:

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