2013-07-12 6 views
10

में फ़ाइल नियमों को ओवरराइड नहीं करना मुझे एक ऐसी स्थिति मिली है जहां मैं अपनी वेबसाइट की उपनिर्देशिका में सभी फ़ाइलों तक पहुंच से इनकार करने का प्रयास कर रहा हूं। मैंने इस उपनिर्देशिका में एक htaccess फ़ाइल जोड़ दी है और इसमें सभी निर्देशों से इनकार कर दिया है। हालांकि, मेरे पास साइट रूट में एक htaccess फ़ाइल भी है, जो विशिष्ट फ़ाइल प्रकारों की अनुमति देती है, और ऐसा लगता है कि इन फ़ाइल प्रकारों को उपनिर्देशिका में अभी भी पहुंच योग्य है, भले ही मैं उन्हें नहीं चाहता हूं। मेरे पास इसके लिए एक कामकाज है (नीचे देखें), लेकिन मुझे लगता है कि एक बेहतर तरीका होना चाहिए। यहाँ मेरी दो htaccess फ़ाइलें हैं:सबडिडायरी htaccess में सभी से इनकार करें रूट htaccess

रूट .htaccess

# Deny access to everything by default 
Order Deny,Allow 
deny from all 

# Allow access to html files 
<Files *.html> 
    allow from all 
</Files> 

Subdirectory .htaccess

# Deny access to everything 
deny from all 

वर्कअराउंड:

Subdirectory .htaccess

# Deny access to everything 
Order Allow,Deny 
deny from all 
<Files *.*> 
    deny from all 
</Files> 

यह वही करता है जो मैं चाहता हूं, लेकिन मुझे लगता है कि सभी कथन कार्य से इनकार करने का एक तरीका होना चाहिए। क्या किसी को पता है कि कैसे?

उत्तर

11

आप इस

# Deny access to everything by default 
Order Deny,Allow 
deny from all 

# Allow access to html files 
<Files *.html> 
    allow from all 
</Files> 

# Deny access to sub directory 
<Files subdirectory/*> 
    deny from all 
</Files> 

की तरह अपने रूट .htaccess उप निर्देशिका में एक अलग .htaccess के लिए कोई जरूरत नहीं है हो सकता है।

आप रूट निर्देशिका में अपने .htaccess में सभी HTML फ़ाइलों तक पहुंच की अनुमति दे रहे हैं और पहले मामले में उप निर्देशिका में कहीं भी इनकार नहीं कर रहे हैं। अपाचे आपके सभी नियमों को पार करता है और अंतिम मिलान नियम का उपयोग करता है, फ़ायरवॉल के विपरीत (जो पहले नियम मिलान हिट का उपयोग करता है)। वैश्विक नियम पहले और विशिष्ट नियम बाद में पढ़े जाते हैं।

+0

आह, धन्यवाद। मैं अब देखता हूं कि मैं गलत कहां गया। मैंने गलती से विश्वास किया था कि रूट htaccess में सभी नियमों का मूल्यांकन उपनिर्देशिका htaccess में सभी नियमों के बाद किया जाएगा। मुझे एहसास नहीं हुआ कि वास्तव में दो फाइलों में घटकों का विलय होता है, जिसके परिणामस्वरूप एक ही पास में लागू किया जाता है। – FrolickingFerret

6

अपाचे में निर्देशों का आदेश वास्तव में स्पष्ट नहीं है।

आपके पास प्रलेखन "How the sections are merged" पर इसका पूरा विवरण है।

विलय के आदेश है:

यहाँ एक अंश है

  • <Directory> (नियमित अभिव्यक्ति को छोड़कर) और (.htaccess के साथ, यदि अनुमति, <Directory> अधिभावी) एक ही साथ किया .htaccess
  • <DirectoryMatch> (और <Directory ~>)
  • <Files> और <FilesMatch> किया एक साथ
  • <Location> और <LocationMatch> एक ही साथ किया
  • <If>

क्या होता है कि आपके <File> निर्देश के बाद निर्देशिका लोगों नियंत्रित किया जाता है (जैसा कि एक .htaccess वास्तव में के लिए एक निर्देशिका के निर्देश है वर्तमान निर्देशिका)।

यह आपके दिए गए उदाहरण में काम करता है क्योंकि थीस फाइल निर्देश वास्तव में .htaccess निर्देशिका निर्देशों में घिरे हुए हैं, और दूसरा फ़ाइल निर्देश मूल निर्देशिका के बाद लागू होता है।

आप माता-पिता में <FileMatch> निर्देश का उपयोग नहीं कर सकते हैं, जहां उपनिर्देशिका से फ़ाइलें बहिष्कृत की जाएंगी, क्योंकि फ़ाइलमैच केवल फ़ाइल नाम पर काम कर रहा है, न कि फ़ाइल पथ पर। लेकिन आप शायद एक स्थानमैच के साथ प्रयास कर सकते हैं, लेकिन यह बिंदुओं के साथ स्थान हैक को भी मना करने के लिए, एक जटिल परिसर में समाप्त हो सकता है।

वास्तव में समाधान मैं यहाँ का प्रयोग करेंगे मूल फ़ोल्डर में एक RedirectMatch है:

RedirectMatch 403 ^.*\.html$ 
+0

उत्तर के लिए धन्यवाद! मैंने आपके द्वारा प्रदान किए गए लिंक पर एक नज़र डाली, और आपके उत्तर के साथ मेरा मानना ​​है कि अब मैं समस्या को समझता हूं। हालांकि, मुझे सच में यकीन नहीं है कि आपके द्वारा प्रदान किए गए रीडायरेक्टमैच को उस विशेष उपफोल्डर में सभी फ़ाइलों तक पहुंच से इनकार कर दिया जाएगा ... – FrolickingFerret

+2

वास्तविक रूप सभी HTML फ़ाइलों तक पहुंच को रोक देगा। मैंने लिखा है कि एक दीर्घकालिक पहले, लेकिन मुझे लगता है कि सही सूत्र कुछ और है: सभी उपनिर्देशिकाओं में, लेकिन 'RedirectMatch 403^.subdirectory/* \ html $' – regilero