Geval 3: Queryparameters toevoegen aan URL
Stel dat er een website genaamd example.com is die standaard een mobiele lay-out toont, maar u geeft de voorkeur aan de desktoplay-out. Gelukkig ondersteunt de website een layout-queryparameter om aan te geven welke lay-out de website weergeeft. Laten we een regel maken die automatisch layout=desktop toevoegt.
Misschien denkt u dat u het als volgt kunt definiëren:
- Omleiden van:
https://example.com/.*(Reguliere expressie) - Omleiden naar:
$0?layout=desktop
$0 verwijst naar de doel-URL. Als u example.com/hello probeert te openen, wordt u omgeleid naar example.com/hello?layout=desktop. Deze functie wordt substitutie genoemd.
Substitutie is ook beschikbaar voor de Wildcard-modus, aangezien deze intern wordt omgezet naar reguliere expressie.
Er zijn echter een paar problemen met deze instellingen.
Probleem 1: Oneindige lus
De huidige instelling creëert een oneindige omleidingslus, aangezien https://example.com/.* ook gericht is op https://example.com/hello?layout=desktop.
In dit geval kunt u een uitgesloten URL-patroon opgeven dat toegang zonder omleiding mogelijk maakt, zoals dit met reguliere expressie:
.*[&?]layout=[^&]*.*
.*: Komt overeen met alles[&?]: Komt overeen met&of?[^&]*: Komt overeen met alles behalve&
Probleem 2: Kan bestaande parameters niet correct verwerken
Als de doel-URL al andere queryparameters heeft, zoals example.com/hello?theme=dark, zal de bestemming example.com/hello?theme=dark?layout=desktop zijn (er zijn twee ? in de URL), maar u kunt de parameters alleen samenvoegen met &. ? als speciaal teken is alleen toegestaan aan het begin van de parameters. Het wordt dus niet behandeld als een geldige parameter.
In dit geval wijzigt u de instellingen als volgt:
- Omleiden van:
(https://example.com/[^?]*)(\(.*))? - Omleiden naar:
$1?layout=desktop&$3
Laten we het stap voor stap bekijken.
(https://example.com/[^?]*): Komt overeen met het deel tot het vorige teken van?.[^?]*komt overeen met alles behalve?.- Dit is omwikkeld met
()zodat u er later naar kunt verwijzen met$1.
(\(.*))?: Komt overeen met een tekenreeks die begint met?, wat queryparameters betekent.- Dit komt ook overeen met een lege tekenreeks door de
?-kwantificator aan het einde van het patroon, wat nul of één keer overeenkomt. - De buitenste
()en de binnenste()kunnen later worden verwezen met$2en$3.
- Dit komt ook overeen met een lege tekenreeks door de
RegExr kan u helpen de details te begrijpen.
RegExr toont een fout wanneer u / niet escapet met \. Hoewel u het kunt escapen, is het niet vereist, aangezien Redirect Web een andere engine van Apple gebruikt die geen escaping vereist.
Dit is geen perfecte oplossing, aangezien het example.com/hello omleidt naar example.com/hello?layout=desktop&, wat een onnodige & aan het einde van de URL bevat. Dit is over het algemeen geen groot probleem, maar als u het wilt verwijderen, kunt u Vastleggen van groepsverwerking gebruiken.
In concluderend is dit de uiteindelijke uitvoer:
- Omleiden van:
(https://example.com/[^?]*)((\(.*))?)(Reguliere expressie) - Omleiden naar:
$1?layout=desktop$3 - Uitgesloten URL-patroon:
.*[&?]layout=[^&]*.*(Reguliere expressie) - Vastleggen van groepsverwerking:
- Groep:
$3 - Proces: Voorkomens vervangen
- Doel:
\?(.*) - Vervanging:
&$1
- Doel:
- Groep:
Dit is slechts een voorbeeld. U kunt ook meerdere regels maken om elk probleem afzonderlijk af te handelen. Dit kan veel eenvoudiger zijn.