Durum 3: URL'ye sorgu parametreleri ekleme
Diyelim ki varsayılan olarak mobil düzen gösteren example.com
adlı bir web sitesi var, ancak siz masaüstü düzenini tercih ediyorsunuz. Neyse ki, web sitesi hangi düzeni göstereceğini belirtmek için bir layout
sorgu parametresini destekliyor. Otomatik olarak layout=desktop
ekleyen bir kural oluşturalım.
Belki de bunu şöyle tanımlayabileceğinizi düşünüyorsunuz:
- Şuradan Yönlendir:
https://example.com/.*
(Normal İfade) - Şuraya Yönlendir:
$0?layout=desktop
$0
hedef URL'yi referans alır. example.com/hello
adresine erişmeye çalışırsanız, example.com/hello?layout=desktop
adresine yönlendirilirsiniz. Bu özelliğe ikame denir.
Joker Karakter modu için de ikame mevcuttur, çünkü dahili olarak Normal İfade'ye dönüştürülür.
Ancak, bu ayarlarda birkaç sorun var.
Sorun 1: Sonsuz döngü
Mevcut ayar, https://example.com/.*
aynı zamanda https://example.com/hello?layout=desktop
adresini de hedeflediği için sonsuz bir yönlendirme döngüsü oluşturur.
Bu durumda, Normal İfade ile şöyle bir hariç tutulan URL deseni belirtebilirsiniz:
.*[&?]layout=[^&]*.*
.*
: Herhangi bir şeyle eşleşir[&?]
:&
veya?
ile eşleşir[^&]*
:&
dışındaki herhangi bir şeyle eşleşir
Sorun 2: Mevcut parametreleri düzgün şekilde işleyememe
Hedef URL'de example.com/hello?theme=dark
gibi başka sorgu parametreleri zaten varsa, hedef example.com/hello?theme=dark?layout=desktop
olacaktır (URL'de iki ?
var), ancak parametreleri yalnızca &
ile birleştirebilirsiniz. Özel bir karakter olarak ?
yalnızca parametrelerin başında izin verilir. Bu nedenle, geçerli bir parametre olarak kabul edilmez.
Bu durumda, ayarları şöyle değiştirin:
- Şuradan Yönlendir:
(https://example.com/[^?]*)(\(.*))?
- Şuraya Yönlendir:
$1?layout=desktop&$3
Adım adım inceleyelim.
(https://example.com/[^?]*)
:?
'nin önceki karakterine kadar olan kısmı eşleştirir.[^?]*
?
dışındaki herhangi bir şeyle eşleşir.- Bu, daha sonra
$1
ile referans alabilmeniz için()
ile sarılmıştır.
(\(.*))?
:?
ile başlayan bir dizeyle eşleşir, bu da sorgu parametreleri anlamına gelir.- Bu aynı zamanda desenin sonundaki
?
niceleyici tarafından boş dizeyle de eşleşir, bu da sıfır veya bir kez eşleşir anlamına gelir. - Dış
()
ve iç()
daha sonra$2
ve$3
ile referans alınabilir.
- Bu aynı zamanda desenin sonundaki
RegExr ayrıntıları anlamanıza yardımcı olabilir.
RegExr, /
'yi \
ile kaçırmadığınızda bir hata gösterir. Kaçırabilirsiniz, ancak Redirect Web, kaçırma gerektirmeyen Apple tarafından farklı bir motor kullandığı için gerekli değildir.
Bu mükemmel bir çözüm değildir, çünkü example.com/hello
adresini example.com/hello?layout=desktop&
adresine yönlendirir, bu da URL'nin sonunda gereksiz bir &
içerir. Genellikle büyük bir sorun değildir, ancak kaldırmak isterseniz Yakalama Grubu İşleme'yi kullanabilirsiniz.
Sonuç olarak, nihai çıktı şudur:
- Şuradan Yönlendir:
(https://example.com/[^?]*)((\(.*))?)
(Normal İfade) - Şuraya Yönlendir:
$1?layout=desktop$3
- Hariç Tutulan URL Deseni:
.*[&?]layout=[^&]*.*
(Normal İfade) - Yakalama Grubu İşleme:
- Grup:
$3
- İşlem: Oluşumları Değiştir
- Hedef:
\?(.*)
- Değiştirme:
&$1
- Hedef:
- Grup:
Bu sadece bir örnektir. Her sorunu ele almak için birden fazla kural da oluşturabilirsiniz. Çok daha basit olabilir.