Host Header'ına göre yönlendirme yapabilir miyim?
Kısa cevap
Evet. Her alan adı ayrı bir vService olacaksa aynı IP ve portu paylaşan HTTP vService'lerde Virtual Hosting kullanılır. Tek vService içinde yönlendirmek için HTTP Header condition'ı (Header Name: Request, Host; Case Insensitive) oluşturulup Conditional Backend Services bloğuna bağlanır. TLS sonlandırılmayan L7 TCP vService'te SSL SNI Info condition'ı, kullanıcıyı başka bir alan adına göndermek için Location Redirection action'ı kullanılır.
Sorun: Birden Fazla Alan Adı Aynı IP'yi Paylaşıyor
Birden fazla web sitesi tek bir genel IP adresinden yayınlanır; hangi sitenin istendiği HTTP isteğindeki Host başlığından (HTTPS'te ayrıca TLS el sıkışmasındaki SNI değerinden) anlaşılır. İsteklerin alan adına göre doğru Kurum Servislerine gönderilmesi gerekir; aksi hâlde bütün alan adları aynı uygulamaya düşer.
Çözüm: Beş Yöntem
Yöntem 1 alan adlarını ayrı vService'lere böler; Yöntem 2–4 tek bir vService içinde Kurum Servisi seçer; Yöntem 5 sunucu seçmez, istemciyi başka bir adrese yönlendirir.
| Durumunuz | Uygun yöntem |
|---|---|
| Her alan adı kendi sertifikası, WAF ve log ayarlarıyla ayrı bir vService olsun | Yöntem 1: Virtual hosting |
| Tek HTTP vService içinde alan adına göre farklı Kurum Servislerine göndermek istiyorum | Yöntem 2: HTTP header (Host) condition'ı |
| Alan adına göre yönlendirmeyi komut satırından kurmak istiyorum | Yöntem 3: WEB-CLI ile URL condition'ı |
| TLS TR7'de açılmıyor (SSL passthrough, L7 TCP) | Yöntem 4: SSL SNI Info condition'ı |
| Kullanıcıyı başka bir alan adına göndermek istiyorum | Yöntem 5: Location redirection |
Yöntem 1: Virtual Hosting Önerilen
- Nasıl çalışır Aynı IP ve portu paylaşan her vService kendi alan adlarını tanımlar; istek
Host(HTTPS'te SNI) değerine göre ilgili vService'e gider. - Nerede açılır vService formu → Virtual Hosting
- Gereksinim Aynı IP:port'u paylaşan bütün vService'lerde alan adı listesi; listede alan adı varken HTTP/3 (QUIC) protokolleri kullanılamaz
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Load Balancer vService List adımları izlenir ve alan adlarından birini karşılayacak HTTP vService açılır (yeni vService oluşturulurken de aynı form kullanılır).
Virtual Hosting anahtarı Enabled konumuna getirilir; ilk alan adı satırı açılır.
Bu vService'in karşılayacağı alan adları satır satır ve küçük harfle girilir (ör. www.example.com; eşleşme büyük/küçük harfe duyarlıdır, alan adı girildiği gibi kaydedilir); joker karakter kullanılabilir (*.example.com, birden fazla alt alan seviyesiyle de eşleşir). Aynı değere birden fazla tanım uyuyorsa (ör. a.example.com ve *.example.com) en özel tanım öncelikli değildir; aynı alan adının birden fazla vService'te tanımlanmasından kaçınılır.
Save butonuna tıklanır.
Aynı IP:port'u paylaşacak her vService için 1–4. adımlar tekrarlanır. Listesi boş bir vService aynı IP:port'a tanımlanamaz; paylaşan vService'lerin frontend'leri aynı şifreleme sınıfında olmalıdır (şifreli: HTTP/1.1, HTTP/2; şifresiz: HTTP, HTTP → HTTPS).
Doğrulama
Her alan adı için ortak IP'ye istek gönderilir. Hiçbir vService'in listesiyle eşleşmeyen HTTP isteklerine 503 döner; HTTPS'te SNI eşleşmezse bağlantı kapatılır.
curl -s -H "Host: www.example.com" http://203.0.113.10/Her alan adı kendi vService'inden yanıt alırYöntem 2: HTTP Header (Host) Condition'ı
- Nasıl çalışır Tek vService içinde
Hostbaşlığına göre Conditional Backend Services bloğu seçilir; eşleşmeyen istekler Default Backend Services'e gider. - Nerede açılırLoad Balancer → Conditions · vService formu → + Conditional backend services
- Gereksinim Hedef sunucuların Kurum Servisi olarak tanımlı olması
- vService tipi HTTP
Adım adım yapılandırma
Alan adlarının sunucuları TR7'de henüz Kurum Servisi olarak tanımlı değilse önce eklenir; tanımlıysa bu adım atlanır. Load Balancer → Backend Services → Add ile her sunucu için Backend Service Name ve Address girilir ve bir Health Check profili seçilir. Ayrıntı: Kurum Servisi nasıl eklenir; hangi bilgiler zorunludur?
Load Balancer → Conditions → Add adımları izlenir; form Conditions · Nasıl eklenir? bölümünde anlatılır.
Condition Name girilir. Criteria = HTTP header; Header Name alanının solundaki seçicide Request ve alanda Host bırakılır (form bu değerlerle açılır). Eşleştirme yöntemi Exact match (varsayılan), Case Insensitive işaretli ve Query = www.example.com girilir. Birden fazla alt alan için eşleştirme End ve Query .example.com kullanılabilir.
Add butonuna tıklanır. Her alan adı için ayrı condition gerekiyorsa 2–4. adımlar tekrarlanır.
Load Balancer → Load Balancer vService List adımları izlenir ve HTTP vService açılır.
Default Backend Services tablosundaki + Conditional backend services butonuna tıklanır (Conditional Backend Services).
Bloğun Select Conditions alanında Host condition'ı, Kurum Servisi seçicisinde o alan adının Kurum Servisleri seçilir. Her alan adı için ayrı blok eklenir; Default Backend Services eşleşmeyen alan adlarını karşılar.
Save butonuna tıklanır.
Doğrulama
Left Monitor Panel → Load Balancer vServices → vService → Logs & Tracking → HTTP Logs ekranında isteğin Host değeri ve isteği yanıtlayan Kurum Servisi karşılaştırılır (HTTP Loglarını Görüntüleme). Kayıt için vService'te LOG alanı açık olmalıdır.
Host: www.example.com → bloğun Kurum ServisiFarklı Host değerleriyle istek gönderilir.
curl -s -H "Host: www.example.com" http://203.0.113.10/Her Host kendi Kurum Servisinden yanıt alırYöntem 3: WEB-CLI ile URL Condition'ı
- Nasıl çalışır Alan adı, tam URL'yi (şema + host + path + query) değerlendiren URL condition'ıyla yakalanır ve koşullu bloğa komut satırından bağlanır.
- Nerede açılır TR7 WEB-CLI →
lb condition·lb service - Gereksinim WEB-CLI erişimi; hedef Kurum Servislerinin tanımlı olması
- vService tipi HTTP
Adım adım yapılandırma
lb condition add criteria url query '^https?://www\.example\.com(:[0-9]+)?/' --content_placement regex --caseInsensitive true --name www-hostURL değeri http(s)://host[:port]/path?query biçimindedir (URL yapısı); düzenli ifade yalnızca www.example.com host'unu, standart dışı port yazılmışsa onunla birlikte yakalar.
lb condition listÇıktıda condition'ın kimliği (lbConditions- ile başlayan değer) alınır; blok condition'ı adıyla değil bu kimlikle tanır.
lb service show <vService>dynamicBackendList listesindeki blok sayısı görülür; yeni blok için ilk boş sıra numarası kullanılır (hiç blok yoksa 0). Dolu bir sıra numarası yazılırsa o sıradaki blok değiştirilir.
vService'te henüz koşullu blok olmadığı durum için (sıra 0):
lb service update id <vService> --dynamicBackendList.0.cond "<koşul-kimliği>" --dynamicBackendList.0.beList.0 <backend-service><backend-service> yerine Kurum Servisinin ya da Backend Group'un adı yazılır.
Doğrulama
vService yeniden görüntülenir; yönlendirme Yöntem 2'nin doğrulama kartlarıyla denetlenir.
lb service show <vService>dynamicBackendList içinde yeni blokYöntem 4: SSL SNI Info Condition'ı
- Nasıl çalışır TLS TR7'de açılmadan, TLS el sıkışmasındaki SNI değerine göre blok seçilir.
- Nerede açılırLoad Balancer → Conditions · L7 TCP vService formu → + Conditional backend services
- Gereksinim Frontend protokolü TCP olan (SSL passthrough) L7 TCP vService
- vService tipi L7 TCP
Adım adım yapılandırma
Her alan adının sunucuları Kurum Servisi olarak tanımlı değilse Yöntem 2'nin 1. adımındaki gibi eklenir.
Load Balancer → Conditions → Add adımları izlenir.
Add butonuna tıklanır.
Load Balancer → Load Balancer vService List adımları izlenir ve frontend protokolü TCP olan L7 TCP vService açılır.
Default Backend Services tablosundaki + Conditional backend services butonuna tıklanır (L7 TCP · Conditional Backend Services).
Bloğun Select Conditions alanında SNI condition'ı, Kurum Servisi seçicisinde o alan adının Kurum Servisleri seçilir.
Save butonuna tıklanır. SNI condition'ı kullanılan vService'te TR7 SNI'ı okumak için bağlantının ilk paketlerini inceler; TLS el sıkışması gelmeyen bağlantılarda kabul 10 saniyeye kadar gecikebilir.
Doğrulama
Her alan adı SNI değeri olarak gönderilir ve dönen sertifikanın hangi sunucuya ait olduğuna bakılır.
openssl s_client -connect 203.0.113.10:443 -servername mail.example.comHer alan adı kendi Kurum Servisinin sertifikasını döndürürYöntem 5: Location Redirection
- Nasıl çalışır Condition'a uyan istek başka bir alan adına 3xx ile yönlendirilir; bu bir sunucu seçimi değildir, istemci yeni adrese yeniden istek gönderir. Ayrıntı: Belirli bir URL'yi başka bir URL'ye 301/302 ile nasıl yönlendiririm?
- Nerede açılırLoad Balancer → Actions · vService formu → Details → Actions
- Gereksinim Bir condition (Location redirection condition'sız kaydedilirse hiç çalışmaz)
- vService tipi HTTP
Adım adım yapılandırma
Yönlendirilecek alan adını tanımlayan Host condition'ı yoksa Yöntem 2'nin 2–4. adımlarıyla oluşturulur.
Load Balancer → Actions → Add adımları izlenir.
Action Type = Location redirection seçilir; Redirect Location alanına hedef adres (ör. https://www.example.com), Redirect Code alanında yönlendirme kodu (ör. 301) girilir ve Conditions alanında Host condition'ı seçilir.
Add butonuna tıklanır.
Load Balancer → Load Balancer vService List adımları izlenip vService açılır ve formun üstündeki Details butonuna tıklanır.
Actions alanında oluşturulan action seçilir.
Save butonuna tıklanır.
Doğrulama
Yönlendirilecek alan adıyla istek gönderilip yanıt başlıklarına bakılır.
curl -sI -H "Host: example.com" http://203.0.113.10/HTTP/1.1 301 · Location: https://www.example.comSık Yapılan Hatalar
- Standart dışı portlarda Host'un portu içerdiğini unutmak. 8443 gibi portlarda istemci
Host: site.com:8443gönderir; Exact matchsite.comile eşleşmez. Bu durumda eşleştirme Start ilesite.com:ya da Regex kullanılır. - Case insensitive'i işaretlememek. İstemciler alan adını büyük harfle gönderebilir.
- TLS'in TR7'de açıldığı vService'te SNI condition'ı kullanmak. SSL SNI Info condition'ı yalnızca TLS'in açılmadığı (passthrough) trafikte değer bulur; TLS sonlandırılan HTTP vService'te Host condition'ı ya da Virtual Hosting, TLS sonlandırılan L7 TCP vService'te (TCP + TLS) Dynamic Condition ile SNI Received from Client değişkeni kullanılır.
- Virtual hosting'i yalnızca bir vService'te açmak. Aynı IP:port'u paylaşan bütün vService'lerde alan adı listesi tanımlı olmalıdır.
- WEB-CLI'da condition'ı adıyla bağlamak.
--dynamicBackendList.N.condcondition kimliğini bekler.
Dokümantasyonda nasıl yapılır
