Apache एकाधिक मिलान स्थान अनुभागों को कैसे मिलाता है


35

मैं कुछ बुनियादी अपाचे विन्यास पर काम कर रहा हूं, लेकिन मुझे ठीक से समझ में नहीं आता है कि <Location>जब विभिन्न आवक URL से मेल खाते हैं तो अपाचे विभिन्न वर्गों को कैसे मिलाता है । अपाचे प्रलेखन अपने "कैसे वर्गों विलय कर रहे हैं" अध्याय में एक छोटा सा भ्रमित जब यह एक ही प्रकार के कई मेल खाते अनुभाग के आदेश / प्राथमिकता की बात आती है।

उदाहरण के लिए, निम्नलिखित अपाचे कॉन्फ़िगरेशन की कल्पना करें (उपेक्षा करें कि क्या वास्तविक सामग्री समझ में आती है या नहीं, मैं केवल प्रत्येक नियम या अनुभाग के आवेदन क्रम में दिलचस्पी रखता हूं):

<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>

अब यदि कोई ग्राहक अनुरोध करता है /sub/foobar, जो अंतिम कॉन्फ़िगरेशन है जो इस अनुरोध पर लागू होगी?

क्या लागू कॉन्फ़िगरेशन इसके बराबर है:

# All the directives contained in all the matchin Locations in declaration order
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all

या हो सकता है

# same as above, but with longest matching path last
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order deny,allow
Require valid-user
Satisfy all
Order allow,deny

या कुछ पूरी तरह से अलग है।

आपकी मदद के लिए धन्यवाद, मैं वास्तव में भ्रमित हूँ।

जवाबों:


44

विलय का क्रम काफी जटिल है, और अपवादों को पकड़ना आसान है ... अपाचे डॉक्टर " कैसे वर्गों का विलय किया जाता है "

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

प्रकार के आदेश है 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 को हरा देगा।


3
ProxyPass निर्देशों के बारे में चेतावनी को हरी झंडी दिखाने के लिए धन्यवाद। मुझे भारी सिरदर्द से बचा लिया
जेरेमी फ्रेंच

2
ProxyPass "दूसरी दिशा में काम करना" के बारे में , यह केवल तभी सच है जब वे बाहर से हों <Location>। एक के अंदर <Location>, विलय के नियमों का <Location>पालन ​​किया जाता है, जिसका अर्थ है कि आप चाहते हैं कि कम से कम विशिष्ट <Location>निर्देश अधिक विशिष्ट लोगों के सामने आएं । यह अधिक विशिष्ट लोगों को कम विशिष्ट निर्देशों को ओवरराइड करने की अनुमति देता है। आपके पास केवल एक ProxyPassप्रति हो सकती है <Location>
orev
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.