विलय का क्रम काफी जटिल है, और अपवादों को पकड़ना आसान है ... अपाचे डॉक्टर " कैसे वर्गों का विलय किया जाता है "
उस प्रलेखन के अनुसार, वर्गों के विलय का क्रम प्रत्येक मिलान प्रकार के लिए सभी मिलान प्रविष्टियों को संसाधित करके किया जाता है, ताकि वे कॉन्फ़िगरेशन फ़ाइलों में सामने आए, और फिर अगले प्रकार (<निर्देशिका के अपवाद के साथ) चल रहे हैं >, जो पथ विशिष्टता के क्रम में व्यवहार किया जाता है)।
प्रकार के आदेश है Directory, DirectoryMatch, Files, और अंत में Location। बाद में पहले के मैचों को अधिलेखित करता है। (* ProxyPass और Alias को फिर से अलग तरह से व्यवहार किया जाता है, नोट को अंत में देखें)
और इन नियमों के कई महत्वपूर्ण अपवाद हैं जो कि ProxyPass, और ProxyPass को एक <Location> अनुभाग में उपयोग करने के लिए लागू होते हैं। (निचे देखो)
तो आपके उदाहरण से ऊपर fswing config के साथ http://somehost.com/sub/foobar अनुरोध कर रहा है ;
<Location / >
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
</Location>
<Location /sub/foo>
Order allow,deny
</Location>
<Location /sub >
Order deny,allow
Require valid-user
Satisfy all
</Location>
<Location /doesnt/match >
ProxyPass !
</Location>
यह निम्नलिखित निर्देशों को संचित करेगा ...।
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all
बाद के मैचों के साथ पिछले डुप्लिकेट को समाप्त करना, जिसके परिणामस्वरूप;
ProxyPass http://backend.com/
Order deny,allow
Require valid-user
Satisfy all
स्पष्टीकरण
बाद में मैचों से पहले के मैचों को अधिलेखित कर देता है, <Directory>जहां मैचों को क्रम में संसाधित किया जाता है: सबसे छोटी निर्देशिका घटक सबसे लंबे समय तक।
इसलिए, उदाहरण के लिए,
उन निर्देशों को कॉन्फ़िगर करने में निर्दिष्ट किए गए आदेश के अनुसार
<Directory /var/web/dir>
संसाधित किया जाएगा
<Directory /var/web/dir/subdir>
, और अधिक विशिष्ट मैच जीतता है।
कोई भी मिलान Locationनिर्देश हमेशा एक पहले से मेल खाते निर्देश को ओवरराइड करेगा Directory।
मूल विचार यह है कि GET /some/http/request.htmlआंतरिक रूप से एक अनुरोध के लिए इसे फाइल सिस्टम में किसी स्थान के माध्यम से अनुवाद किया जाएगा Alias, ScriptAliasया वर्चुअलहॉट के लिए एक सामान्य फ़ाइल स्थान के DocumentRootलिए जिसका वह मिलान करता है।
तो एक अनुरोध में निम्नलिखित गुण होंगे जो इसे मिलान के लिए उपयोग करते हैं:
Location: /some/http/request.html
File: /var/www/html/mysite/some/http/request.html
Directory: /var/www/html/mysite/some/http
अपाचे तो लागू होगी में के सभी बारी Directory, मैचों config से निर्देशिका विशिष्टता के क्रम में, है, और फिर बारी में लागू DirectoryMatch, Files, और अंत में Locationवे किस क्रम में सामना होता है में मेल खाता है।
इसलिए Locationओवरराइड Files, जो ओवरराइड करता है DirectoryMatch, Directoryसबसे कम प्राथमिकता पर मिलान करने वाले रास्तों के साथ । इसलिए ऊपर दिए गए आपके उदाहरण /sub/foobarमें, क्रम में पहले 3 स्थान से मेल खाने का अनुरोध है , इसलिए पिछले एक को परस्पर विरोधी निर्देशों के लिए जीतना होगा।
(आप ठीक कह रहे हैं कि यह डॉक्स कैसे किनारे से कुछ मामलों हल कर रहे हैं से स्पष्ट है, इसकी संभव नहीं है कि किसी भी allow from *प्रकार के निर्देशों जुड़े से जुड़ा होगा Order allow,deny, लेकिन मुझे लगता है कि परीक्षण नहीं किया था। इसके अलावा क्या होता है अगर आप से मेल खाते हैं Satisfy Any, लेकिन आप पहले एक एकत्र किया है Allow from *...)
ProxyPass और Alias के बारे में दिलचस्प जानकारी
बस परेशान होने के लिए, ProxyPassऔर Aliasदूसरी दिशा में काम करने के लिए प्रतीत होता है .... ;-) यह मूल रूप से पहले मैच को हिट करता है, फिर रुक जाता है और इसका उपयोग करता है!
Ordering ProxyPass Directives
The configured ProxyPass and ProxyPassMatch rules are
checked in the order of configuration.
The first rule that matches wins. So
usually you should sort conflicting ProxyPass rules starting with the
longest URLs first. Otherwise later rules for longer URLS will be
hidden by any earlier rule which uses a leading substring of the URL.
Note that there is some relation with worker sharing.
For the same reasons exclusions must come before the general
ProxyPass directives.
इसलिए मूल रूप से, उपनाम और प्रोक्सीपास निर्देशों को निर्दिष्ट करना होगा, सबसे विशिष्ट पहले;
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
तथा
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
हालांकि, @orev ने बताया है। आपके पास किसी स्थान निर्देश में ProxyPass निर्देश हो सकता है, और इसलिए किसी स्थान में एक अधिक विशिष्ट ProxyPass किसी भी पहले से पाए गए ProxyPass को हरा देगा।