Proxy_pass kullanırken nginx'e bir yanıt başlığı nasıl eklenir?


92

Nginx'in arkasındaki sunucudan alınan yanıt için özel bir başlık eklemek istiyorum.

İken add_headerzaman nginx işlenmiş yanıtlar için işler, hiçbir şey yapmaz proxy_passkullanılır.


Yani proxy'ye istek iletiyorsunuz ve bu proxy seti yanıtı ve bu yanıta özel başlığınızı kullanıcıya gönderilmeden önce eklemek istiyorsunuz, bu doğru mu?
emka86

Yanıtlar:


31

Başlıklar üzerinde size daha fazla kontrol sağlayan HttpHeadersMoreModule adında bir modül vardır . Nginx ile gelmez ve ek kurulum gerektirir. Bununla bunun gibi bir şey yapabilirsiniz:

location ... {
  more_set_headers "Server: my_server";
}

Bu, "Sunucu çıkış başlığını herhangi bir durum kodu ve herhangi bir içerik türü için özel değere ayarlayacaktır". Önceden ayarlanmış başlıkların yerini alacak veya ayarlanmamışsa ekleyecektir.


Bir yanıt tanımlama bilgisine eklemek Secureve HttpOnlyişaretlemek mümkün müdür ? Hedef yanıt tanımlama bilgisi yalnızca tanımlama bilgisine ve özniteliklere sahiptir. nameexpire
JPaulPunzalan

2
Yanıt başlıklarını değiştirebilmek veya ekleyebilmek için mutlaka bir kitaplığa ihtiyacınız yoktur ve en çok oylanan yanıtın aksine bir başlığı geçersiz kılabilirsiniz, önce onu kaldırmanız gerekir. Ayrıntılar için aşağıdaki cevabımı kontrol edin .
Wilt

162

add_headerOlmadığı kadar iyi çalışır proxy_pass. Bugün tam olarak bu yönergeyi kullandığım bir yapılandırma kurdum. Yine de, sebebini tam olarak hatırlamadan bunu kurmakla da mücadele ettiğimi itiraf etmeliyim.

Şu anda çalışan bir yapılandırmam var ve aşağıdakileri içeriyor (diğerleri arasında):

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

1.7.5 Nginx'ten önce add_header , Sebastian Goodman'ın yanıtında bahsettiği HttpHeadersMoreModule'ün aksine yalnızca başarılı yanıtlar üzerinde çalışıyordu .

Nginx'ten bu yana , hata yanıtlarında bile özel başlıklar eklemek 1.7.5için anahtar kelimeyi kullanabilirsiniz always. Örneğin:

add_header X-Upstream $upstream_addr always;

Sınırlama:server kullanarak başlık değerini geçersiz kılamazsınız add_header.


41
Nginx 1.7.5'ten bu yana, add_header kullanarak hata yanıtlarına özel üstbilgileri eklemek için "her zaman" seçeneğini kullanabilirsiniz:add_header X-Upstream $upstream_addr always;
Shane

Her neyse, proxy sunucusunun IP / bağlantı noktası kombinasyonunu açığa çıkarmadan benzer işlevselliğe sahip olmak? örn. X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 muhtemelen altyapıyı maskelemede yardımcı olmaz, ancak fikri iletir).
zamnuts

@zamnuts: Yukarı akış IP'sini ve bağlantı noktası numaralarını aktarmak, add_headeryönergeyi kullanmaya yalnızca bir örnektir . Hiç göndermenize gerek yok .
Oliver

@Oliver, bunun farkındayım, ancak IP / bağlantı noktası numaraları veya bunların gizlenmesi dışında alternatif bir bireysel / benzersiz yukarı akış tanımlayıcıyı araştırıyordum. Belki de sorum kapsam dışı ve yeni bir gönderi oluşturmalıyım :)
zamnuts

@zamnuts: Ben de yeni bir soru sormanızı öneririm :-)
Oliver

25

Oliver'ın yazdığı gibi:

add_headerOlmadığı kadar iyi çalışır proxy_pass.

Bununla birlikte, Shane'in yazdığı gibi, Nginx 1.7.5'ten itibaren, hata yanıtlarında çalışmaya alwaysbaşlamak için add_headeraşağıdaki gibi geçmeniz gerekir :

add_header  X-Upstream  $upstream_addr always;

5
Başlıklarımın neden gösterilmediğini merak ederek, onları sunucu bloğunda, konum bloğunda taşımaya çalışarak uzun bir süre geçirdim ... ve işte sebebi şuydu: nginx bunları hata yanıtlarına
eklemiyor

Ben de :) ve bu cevaba rağmen geçen gün yine başıma geldi. Kendi cevabımı gözden geçirmem gerekiyordu.
Dmitry Minkovsky


16

Yanıt başlığını gizleyin ve ardından yeni bir özel başlık değeri ekleyin

İle bir başlık eklemek add_headerProxy iyi çalışır, ancak yanıtta mevcut bir başlık değeri varsa, değerleri yığınlayacaktır.

Bir başlık değerini ayarlamak veya değiştirmek istiyorsanız (örneğin, Access-Control-Allow-Originçapraz kaynak kaynak paylaşımına izin vermek için istemcinizle eşleşecek şekilde başlığı değiştirin ), aşağıdakileri yapabilirsiniz:

# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;

Yani proxy_hide_header birleştiğinde add_headersize yanıt başlığı değerlerini ayarlama / değiştirme gücü verir.

Benzer cevap bulunabilir burada ServerFault'ta bulunabilir

GÜNCELLEME:

Not: proxy_set_header İstek daha fazla gönderilmeden önce istek başlıklarını ayarlamak içindir, yanıt başlıklarını ayarlamak için değildir (başlıklar için bu yapılandırma özellikleri biraz kafa karıştırıcı olabilir).


Teşekkürler, harika yardım
Lancer.Yan

14

Bu çözümü deneyebilirsiniz:

Bloğunuzda böyle bir şey locationyaptığınızda proxy_pass:

location ... {

  add_header yourHeaderName yourValue;
  proxy_pass xxxx://xxx_my_proxy_addr_xxx;

  # Now use this solution:
  proxy_ignore_headers yourHeaderName // but set by proxy

  # Or if above didn't work maybe this:
  proxy_hide_header yourHeaderName // but set by proxy

}

Tam olarak ihtiyacınız olan şeyin bu olduğundan emin değilim, ancak bu yöntemin bazı manipülasyonlarını deneyin ve belki sonuç sorununuza uyacaktır.

Ayrıca bu kombinasyonu kullanabilirsiniz:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;

6
Bu yöntemi nginx mevcut olanın üzerine yazmak yerine yinelenen bir başlık eklediği için kullanmak zorunda kaldım. location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }
ether6
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.