Header değerini regex ile değiştirebilir miyim?
Kısa cevap
Evet, Replace HTTP Header Content aksiyonuyla. Header to Replace alanına başlık adı, Regex to Match alanına desen, Replacement Content alanına yeni değer yazılır; desen değerde eşleşirse değerin tamamı Replacement content ile yeniden yazılır, korunacak kısımlar yakalama gruplarıyla \1, \2 biçiminde geri eklenir. Eşleşme büyük/küçük harfe duyarlıdır. Match Type ile bütün değer ya da virgülle ayrılmış değerlerin her biri ayrı ayrı işlenir. Aksiyon Execution Level seçimine göre isteğe ya da yanıta uygulanır.
Temel Bilgi
Regex, metinde aranan bir kalıbı tanımlar. ^ değerin başını, $ sonunu, .* "herhangi bir şey"i, [0-9]+ bir ya da daha fazla rakamı gösterir; \. noktanın kendisini arar. Parantez içindeki bölüm yakalama grubudur ve yerine koyma metninde \1 (birinci grup), \2 (ikinci grup) ile geri kullanılır.
Sorun: Başlığın Değerinin Yalnızca Bir Kısmı Değişmeli
Kurum Servisinin döndürdüğü Location başlığındaki iç adres, bir çerezin alan adı ya da X-Forwarded-For listesindeki adresler gibi bir değerin yalnızca belirli kısmı değiştirilmeli, geri kalanı korunmalıdır. Bu, başlığın tamamını sabit bir değerle ezen Set HTTP Header ile yapılamaz.
Çözüm: İki Yöntem
İki yöntemde de desenler Perl uyumlu (PCRE) sözdizimiyle yazılır.
| Durumunuz | Uygun yöntem |
|---|---|
| Mevcut değerin bir kısmını desenle değiştirmek, gerisini korumak | Yöntem 1: Replace HTTP Header Content |
| Değeri başka bir başlıktan ya da değişkenden türetip yazmak (başlık yoksa oluşturmak) | Yöntem 2: Set HTTP Header + Replace fonksiyonu |
Yöntem 1: Replace HTTP Header Content Önerilen
- Nasıl çalışır Desen değerin herhangi bir yerinde aranır; eşleşirse değerin tamamı Replacement content'in grup başvuruları doldurulmuş hâliyle değiştirilir, eşleşmezse değer olduğu gibi kalır.
- Nerede açılırLoad Balancer → Actions → Replace HTTP Header Content
- Gereksinim Başlık istekte ya da yanıtta bulunmalı (yoksa hiçbir şey yapılmaz)
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Actions → Add tıklanır (nasıl eklenir).
Action Name girilir, Action Type = Replace HTTP header content seçilir. Execution Level: Kurum Servisinin yanıtındaki başlık için On response, Kurum Servisine giden istekteki başlık için On request (varsayılan; kayıttan sonra değiştirilemez). Header to Replace = Location.
Regex to Match = ^http://192\.0\.2\.10:8080(.*)$; Replacement Content = https://www.example.com\1. Alanın yanındaki deney şişesi simgesi (Test this pattern against a sample input) ile desen örnek bir değerde denenir. Replacement content'te desendeki grup sayısından büyük bir başvuru (ör. tek grupta \2) hata verir; $1 yazılırsa arayüz Group references are written as \1, not $1 uyarısını gösterir.
Match Type = Replace whole header (varsayılan): başlığın bütün değeri tek parça işlenir; Location, Set-Cookie gibi başlıklar için. Replace values separated by comma: virgülle ayrılmış her değer ayrı işlenir; X-Forwarded-For, Accept gibi çok değerli başlıklar için (eşleştirme modları).
Add tıklanır.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit tıklanır.
Save tıklanır. Değişiklik açık bağlantılar kopmadan uygulanır; cluster'da varsayılan auto-sync ile eş cihaza da gönderilir (Manual Sync Mode açıksa Synchronize ile).
Örnek desenlerin sonuçları:
| Başlık · Match type | Regex to Match | Replacement content | Değer | Sonuç |
|---|---|---|---|---|
| Location · whole | ^http://192\.0\.2\.10:8080(.*)$ | https://www.example.com\1 | http://192.0.2.10:8080/login | https://www.example.com/login |
http://192.0.2.10:8080 | https://www.example.com | |||
http://192.0.2.100:8080/x | Değişmez | |||
| Location · whole | ^http://(.*)$ | https://\1 | http://www.example.com/giris?x=1 | https://www.example.com/giris?x=1 |
HTTP://www.example.com/b | Değişmez (harf duyarlı); (?i)^http://(.*)$ ile değişir | |||
| Set-Cookie · whole | ^(.*)Domain=app\.internal(.*)$ | \1Domain=example.com\2 | SID=1; Domain=app.internal; Path=/ | SID=1; Domain=example.com; Path=/ |
| X-Forwarded-For · comma | ^(198\.51\.100)\.[0-9]+$ | \1.0 | 198.51.100.23, unknown, 198.51.100.77 | 198.51.100.0, unknown, 198.51.100.0 |
Doğrulama
vService'te Debug açılır; Debug Mode Logs kaydının Response sekmesindeki başlık listesine bakılır.
Location satırı koyu turuncu ve sağ ok simgeli: eski değer soluk kırmızı, yeni değer yeşilKurum Servisinin yönlendirme döndürdüğü adres istenir: curl -skI https://www.example.com/giris
Location: https://www.example.com/loginYöntem 2: Set HTTP Header + Replace Fonksiyonu
- Nasıl çalışır Header content alanında başlığın mevcut değeri Smart Variable olarak alınır ve Replace (first) ya da Replace (all) fonksiyonuyla değiştirilip başlığa yazılır; başlık yoksa oluşturulur.
- Nerede açılırLoad Balancer → Actions → Set HTTP Header → Header Content → fx
- Gereksinim Fonksiyon deseni parantez (grup) içermez; grup gerekiyorsa Yöntem 1 kullanılır
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Actions → Add tıklanır.
Action Name girilir, Action Type = Set HTTP header seçilir. Execution Level = On request; Header to Edit = Host.
Header Content alanındaki fx ile Request HTTP header content seçilir ve başlık adı olarak host girilir (yanıt başlığı için On response'ta Response HTTP header content).
Değişken penceresinde Add Functions → Replace (first): To Replace = :[0-9]+$, New Value boş bırakılır (eşleşen bölüm silinir). Örnek değer standart dışı porttan gelen Host'tan portu kaldırır.
Add tıklanır.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit tıklanır.
Details → Actions alanında aksiyon seçilir.
Save tıklanır.
| Host | Sonuç |
|---|---|
www.example.com:8443 | www.example.com |
www.example.com | www.example.com (değişmez) |
[2001:db8::1]:8443 | [2001:db8::1] |
Doğrulama
curl -sk https://www.example.com:8443/ gönderilir; Debug Mode Logs kaydının Request sekmesine bakılır.
Host satırı koyu turuncu: www.example.com:8443 → www.example.comSık Yapılan Hatalar
Değerin tamamı yeniden yazılır
Eşleşme olduğunda yalnızca eşleşen kısım değil, değerin tamamı Replacement content ile değiştirilir. ^ ile başlamayan http://(.*) deseni https://www.example.com/?next=http://x değerinin ortasında eşleşir ve değer https://x olur. Desen ^ ve $ ile bütün değeri kapsayacak biçimde yazılır, korunacak her kısım grupla yakalanır.
$1yazmak. Grup başvuruları\1biçimindedir; arayüz uyarı gösterir.- Harf duyarlılığını unutmak. Eşleşme büyük/küçük harfe duyarlıdır; duyarsız eşleşme için desenin başına
(?i)eklenir. - Noktayı kaçışsız yazmak.
.herhangi bir karakterle eşleşir; IP ve alan adlarında\.yazılır. - Çok değerli başlıkta Replace whole header kullanmak. X-Forwarded-For gibi başlıklarda desen bütün listeye uygulanır; her değer için Replace values separated by comma seçilir. Set-Cookie'de ise tarih virgül içerdiği için Replace whole header kalır.
- Execution level'ı yanlış seçmek. Kurum Servisinin yanıtındaki başlık On response'ta değişir; Execution level kayıttan sonra değiştirilemez.
Dokümantasyonda nasıl yapılır
