Ana içeriğe geç

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.

ipucu

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.

RegExr ayrıntıları anlamanıza yardımcı olabilir.

not

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

⬇️ Kuralı İndir

Bu sadece bir örnektir. Her sorunu ele almak için birden fazla kural da oluşturabilirsiniz. Çok daha basit olabilir.