NGINX yapılandırmasında iki konum için nasıl aynı kurala sahip olabilirim?


153

NGINX yapılandırmasında iki konum için nasıl aynı kurala sahip olabilirim?

Aşağıdakileri denedim

server {
  location /first/location/ | /second/location/ {
  ..
  ..
  }
}

ancak nginx yeniden yükleme bu hatayı attı:

nginx: [emerg] invalid number of arguments in "location" directive**

Yanıtlar:


239

Deneyin

location ~ ^/(first/location|second/location)/ {
  ...
}

~Araçlar url için normal bir ifade kullanmak. ^Aracı ilk karakterden kontrol etmek. Bu, /ardından konumlardan birini ve ardından diğerini arayacaktır /.


37
NOT: Bu sık sık meydana gelirse (binlerce gibi), normal ifade eşleşmesi nedeniyle bir performans cezasına neden olur. Ayrıca eşleşme sırası da oldukça farklıdır. Birçok "küçük" durumda, istediğiniz gibi davranacaktır, ancak bu farkında olmak için bir şeydir. Ben şahsen Nginx "konum" bir regex kuralına güvenmek yerine birden çok "=" koşullarını desteklemek istiyorum.
Bernard

7
IMHO, bu daha verimli olmalı: location ~ (patternOne | patternTwo) {...}
stamster

2
Bu çözüm benim için işe yaramadı; ancak @ stamster'ın yorumu; Koşuyorumnginx/1.13.2
TJ Biddle

1
proxy_passÇalışmanız gerekiyorsa bu cevaba bakın: stackoverflow.com/a/46625656/1246870
avs099

1
Orijinal URL eğik çizgi ile sona erdiğinde bu benim için çalışmaz
The Godfather

88

Başka bir seçenek de dahil edilen bir dosyayı kullanarak iki önek konumundaki kuralları tekrarlamaktır. Ön ek konumları yapılandırmada konumdan bağımsız olduğundan, daha sonra başka normal ifadeler konumları ekledikçe bunları kullanmak biraz karışıklık yaratabilir. Düzenli olarak regex konumlarından kaçınmak, yapılandırmanızın sorunsuz bir şekilde ölçeklenmesine yardımcı olacaktır.

server {
    location /first/location/ {
        include shared.conf;
    }
    location /second/location/ {
        include shared.conf;
    }
}

İşte paylaşılan bir örnek.conf:

default_type text/plain;
return 200 "http_user_agent:    $http_user_agent
remote_addr:    $remote_addr
remote_port:    $remote_port
scheme:     $scheme
nginx_version:  $nginx_version
";

lütfen shared.conförnek ve yer ekleyebilir misiniz ?
Дмитрий Кулешов

5
Bir örnek shared.conf dosyası ekledim. Shared.conf dosyasının mutlak yolunu kullanabilir veya nginx dizininize koyabilirsiniz. Bu durumda, sadece birkaç yönerge içerir.
Cole Tierney

40

Hem regex hem de dahil edilen dosyalar iyi yöntemlerdir ve bunları sık sık kullanıyorum. Ancak başka bir alternatif, birçok durumda - özellikle daha karmaşık olanlarda - yararlı bir yaklaşım olan “adlandırılmış konum” kullanmaktır. Resmi sayfası "Eğer Evil olduğunu" şeyler yapmak için iyi bir yol olarak aşağıdaki esasen gösterir:

error_page 418 = @common_location;
location /first/location/ {
    return 418;
}
location /second/location/ {
    return 418;
}
location @common_location {
    # The common configuration...
}

Bu çeşitli yaklaşımların avantajları ve dezavantajları vardır. Normal ifadenin büyük bir avantajı, maçın bazı bölümlerini yakalayabilmeniz ve tepkiyi değiştirmek için kullanabilmenizdir. Tabii ki, orijinal blokta bir değişken ayarlayarak veya kullanarak diğer yaklaşımlarla benzer sonuçlar elde edebilirsiniz map. Normal ifade yaklaşımının dezavantajı, çeşitli konumlarla eşleşmek istiyorsanız uygunsuz olabilmesidir, ayrıca normal ifadenin düşük önceliği, konumlarla nasıl eşleştirmek istediğinize uymayabilir - görünüşte performans etkileri olduğunu belirtmemek gerekir. bazı durumlarda regexes.

Dosyaları eklemenin ana avantajı (anlayabildiğim kadarıyla), tam olarak neleri ekleyebileceğiniz konusunda biraz daha esnek olmasıdır - örneğin, tam bir konum bloğu olmak zorunda değildir. Ama aynı zamanda öznel olarak adlandırılmış konumlardan biraz daha karmaşık.

Ayrıca, benzer durumlarda kullanabileceğiniz ilgili bir çözüm olduğunu unutmayın: iç içe konumlar. Fikir, çok genel bir konumla başlamanız, olası eşleşmelerin birçoğuna ortak bazı yapılandırmalar uygulamanız ve daha sonra eşleştirmek istediğiniz farklı yol türleri için ayrı iç içe konumlara sahip olmanızdır. Örneğin, böyle bir şey yapmak yararlı olabilir:

location /specialpages/ {
    # some config
    location /specialpages/static/ {
        try_files $uri $uri/ =404;
    }
    location /specialpages/dynamic/ {
        proxy_pass http://127.0.0.1;
    }
}

7

Bu kısa ama etkili ve kanıtlanmış bir yaklaşımdır:

location ~ (patternOne|patternTwo){ #rules etc. }

Böylece, aynı konum bloğuna / kurallarına işaret eden basit boru sözdizimi ile kolayca birden fazla desen olabilir.

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.