Birleşme sırası oldukça karmaşıktır ve istisnalar tarafından kolayca anlaşılabilir ... Apache doktoru " Bölümlerin nasıl birleştirildiği " dür.
Bu dokümantasyona göre, bölümlerin birleştirme sırası, her bir eşleşme türü için eşleşen girişlerin tümü, yapılandırma dosyalarında karşılaşıldıkları sırayla işlenerek ve daha sonra bir sonraki türe taşınmasıyla yapılır (<Directory hariç) >, yola özgüllük sırasına göre işlenir).
Türlerinden sırasıdır Directory
, DirectoryMatch
, Files
ve nihayet Location
. Daha sonra eşleşmeleri, önceki eşleşmelerin üzerine yaz. (* ProxyPass ve Alias tekrar farklı şekilde ele alınır, sonunda nota bakın)
Ayrıca, bir <Location> bölümünde ProxyPass ve ProxyPass kullanımı için geçerli olan bu kuralların bazı önemli istisnaları vardır. (aşağıya bakınız)
Bu nedenle yukarıdaki örneğinizden, http://somehost.com/sub/foobar dosyasını follwing config ile istemek ;
<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>
Aşağıdaki yönergeleri toplardı ....
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all
Daha sonraki maçlarda önceki kopyaları elemek, sonuçta;
ProxyPass http://backend.com/
Order deny,allow
Require valid-user
Satisfy all
Açıklama
Daha sonra eşleşmelerin <Directory>
sırayla işlendiği durumlar hariç önceki eşleşmelerin üzerine yazılır : en kısa dizin bileşeni ile en uzun süre.
Bu nedenle, örneğin,
bu direktiflerin config'de hangi sırayla belirtildiğine bakılmaksızın
<Directory /var/web/dir>
işlenecektir
<Directory /var/web/dir/subdir>
ve daha spesifik maç kazanır.
Eşleşen herhangi bir Location
yönerge, daha önce eşleşen bir Directory
yönergeyi her zaman geçersiz kılar .
Temel fikir gibi bir istek için olmasıdır GET /some/http/request.html
içten bir yoluyla dosya sistemindeki bir konuma tercüme edilecek Alias
, ScriptAlias
ya altında normal bir dosya konumu için DocumentRoot
VirtualHost için eşleşen.
Dolayısıyla, bir istek eşleştirme için kullandığı aşağıdaki özelliklere sahip olacaktır:
Location: /some/http/request.html
File: /var/www/html/mysite/some/http/request.html
Directory: /var/www/html/mysite/some/http
Apaçi sonra tümünü açın uygulanacak Directory
yapılandırmasındaki, dizin özgüllük sırasına göre maçları ve sonra sırayla uygulamak DirectoryMatch
, Files
ve nihayet Location
onlar karşılaşılan sırayla eşleşir.
Bu nedenle, Location
geçersiz Files
kılan geçersiz kılmalar DirectoryMatch
, Directory
en düşük önceliğe sahip yollar eşleşiyor . Bu nedenle yukarıdaki örneğinizde /sub/foobar
, ilk 3 Konum’u sırayla eşleştirme isteği , bu nedenle sonuncusu çelişkili yönergeler için kazanır.
(Bazı ileri vakaların nasıl çözüldüğü, dokümanlardan açıkça anlaşılmadığına, herhangi bir allow from *
tür direktifin ilişkili olabileceği ihtimaline karşı açıksınız Order allow,deny
, ancak bunu test etmedim. Ayrıca eşleşirseniz ne olur Satisfy Any
? daha önce bir topladım Allow from *
...)
ProxyPass ve Alias hakkında ilginç not
Sadece sinir bozucu olmak ProxyPass
ve Alias
diğer yönde çalışmak gibi görünüyor .... ;-) Temelde ilk karşılaşmayı vurur, sonra durur ve kullanır!
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.
Bu nedenle, temel olarak, ilk önce Alias ve ProxyPass yönergelerinin belirtilmesi gerekir;
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
ve
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
Ancak @ orev'in işaret ettiği gibi. Bir Konum direktifinde bir ProxyPass yönergesi olabilir ve böylece bir Konumdaki daha spesifik bir ProxyPass daha önce bulunan ProxyPass'leri yener.