Apache birden fazla eşleşen Konum bölümünü nasıl birleştiriyor?


34

Bazı temel apache konfigürasyonları üzerinde çalışıyorum, ancak <Location>birçoğunun gelen bir istek URL'si ile eşleşmesi durumunda, apache'nin farklı bölümleri nasıl birleştirdiğini tam olarak anlamıyorum . Apache belgeleri onun "bölümleri birleştirilir Nasıl" bölümünde aynı türden çok sayıda eşleştirme bölümlerinin sırası / önceliğine gelince biraz kafa karıştırıcı olduğunu.

Örneğin, aşağıdaki apache yapılandırmasını hayal edin (asıl içeriğin anlamlı olup olmadığını göz ardı edin, yalnızca her kuralın / bölümün uygulama sırası ile ilgileniyorum):

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

Şimdi bir müşteri talepte bulunursa /sub/foobar, bu talebe uygulanacak son yapılandırma hangisidir?

Uygulanan yapılandırma eşdeğer midir:

# 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

ya da belki

# 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

ya da tamamen farklı bir şey.

Yardımlarınız için teşekkürler, gerçekten kafa karıştırıcıyım.

Yanıtlar:


43

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, Filesve 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 Locationyönerge, daha önce eşleşen bir Directoryyönergeyi her zaman geçersiz kılar .

Temel fikir gibi bir istek için olmasıdır GET /some/http/request.htmliçten bir yoluyla dosya sistemindeki bir konuma tercüme edilecek Alias, ScriptAliasya altında normal bir dosya konumu için DocumentRootVirtualHost 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 Directoryyapılandırmasındaki, dizin özgüllük sırasına göre maçları ve sonra sırayla uygulamak DirectoryMatch, Filesve nihayet Locationonlar karşılaşılan sırayla eşleşir.

Bu nedenle, Locationgeçersiz Fileskılan geçersiz kılmalar DirectoryMatch, Directoryen 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 ProxyPassve Aliasdiğ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.


3
ProxyPass Direktiflerinin Sipariş Edilmesi uyarısını işaretlediğiniz için teşekkür ederiz. Beni çok fazla başağrısından kurtardı
Jeremy French

2
İlişkin ProxyPass "diğer yönde çalışan" , bu takdirde onlar içinde konum dışında sadece doğrudur <Location>. Bir içinde <Location>, birleşme kurallarına uyulur <Location>, yani en az spesifik <Location>yönergelerin daha spesifik olanların önüne gelmesini istersiniz . Bu, daha spesifik olanların daha az spesifik yönergeleri geçersiz kılmalarını sağlar. Yalnızca bir olabilir ProxyPassper <Location>.
orev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.