Περίπτωση 3: Προσθήκη παραμέτρων ερωτήματος στο URL
Ας υποθέσουμε ότι υπάρχει ένας ιστότοπος που ονομάζεται example.com ο οποίος εμφανίζει μια διάταξη για κινητά από προεπιλογή, αλλά εσείς προτιμάτε τη διάταξη για επιτραπέζιους υπολογιστές. Ευτυχώς, ο ιστότοπος υποστηρίζει μια παράμετρο ερωτήματος layout για να καθορίσει ποια διάταξη εμφανίζει ο ιστότοπος. Ας δημιουργήσουμε έναν κανόνα που προσθέτει αυτόματα layout=desktop.
Ίσως νομίζετε ότι θα μπορούσατε να το ορίσετε ως εξής:
- Ανακατεύθυνση Από:
https://example.com/.*(Κανονική Έκφραση) - Ανακατεύθυνση Σε:
$0?layout=desktop
Το $0 αναφέρεται στο URL προορισμού. Αν προσπαθήσετε να αποκτήσετε πρόσβαση στο example.com/hello, ανακατευθύνεστε στο example.com/hello?layout=desktop. Αυτή η λειτουργία ονομάζεται αντικατάσταση.
Η αντικατάσταση είναι επίσης διαθέσιμη για τη λειτουργία Μπαλαντέρ, καθώς μετατρέπεται εσωτερικά σε Κανονική Έκφραση.
Ωστόσο, υπάρχουν μερικά προβλήματα με αυτές τις ρυθμίσεις.
Πρόβλημα 1: Άπειρος βρόχος
Η τρέχουσα ρύθμιση δημιουργεί έναν άπειρο βρόχο ανακατεύθυνσης, καθώς το https://example.com/.* στοχεύει επίσης το https://example.com/hello?layout=desktop.
Σε αυτήν την περίπτωση, μπορείτε να καθορίσετε ένα εξαιρούμενο μοτίβο URL που σας επιτρέπει να έχετε πρόσβαση χωρίς ανακατεύθυνση, όπως αυτό με Κανονική Έκφραση:
.*[&?]layout=[^&]*.*
.*: Ταιριάζει με οτιδήποτε[&?]: Ταιριάζει είτε με&είτε με?[^&]*: Ταιριάζει με οτιδήποτε εκτός από&
Πρόβλημα 2: Δεν μπορεί να χειριστεί σωστά τις υπάρχουσες παραμέτρους
Εάν το URL προορισμού έχει ήδη άλλες παραμέτρους ερωτήματος όπως example.com/hello?theme=dark, ο προορισμός θα είναι example.com/hello?theme=dark?layout=desktop (Υπάρχουν δύο ? στο URL) αλλά μπορείτε να ενώσετε τις παραμέτρους μόνο με &. Το ? ως ειδικός χαρακτήρας επιτρέπεται μόνο στην αρχή των παραμέτρων. Επομένως, δεν αντιμετωπίζεται ως έγκυρη παράμετρος.
Σε αυτήν την περίπτωση, αλλάξτε τις ρυθμίσεις ως εξής:
- Ανακατεύθυνση Από:
(https://example.com/[^?]*)(\?(.*))? - Ανακατεύθυνση Σε:
$1?layout=desktop&$3
Ας το δούμε βήμα προς βήμα.
(https://example.com/[^?]*): Ταιριάζει με το μέρος μέχρι τον προηγούμενο χαρακτήρα του?.[^?]*ταιριάζει με οτιδήποτε εκτός από?.- Αυτό είναι τυλιγμένο με
()ώστε να μπορείτε να το αναφέρετε με$1αργότερα.
(\(.*))?: Ταιριάζει με μια συμβολοσειρά που ξεκινά με?, που σημαίνει παραμέτρους ερωτήματος.- Αυτό ταιριάζει επίσης με κενή συμβολοσειρά από τον ποσοτικό δείκτη
?στο τέλος του μοτίβου, ο οποίος ταιριάζει μηδέν ή μία φορά. - Το εξωτερικό
()και το εσωτερικό()μπορούν να αναφερθούν με$2και$3αργότερα.
- Αυτό ταιριάζει επίσης με κενή συμβολοσειρά από τον ποσοτικό δείκτη
Το RegExr μπορεί να σας βοηθήσει να κατανοήσετε τις λεπτομέρειες.
Το RegExr εμφανίζει ένα σφάλμα όταν δεν διαφεύγετε το / με \. Αν και μπορείτε να το διαφύγετε, δεν απαιτείται, καθώς το RedirectWeb χρησιμοποιεί μια διαφορετική μηχανή της Apple που δεν απαιτεί διαφυγή.
Αυτή δεν είναι μια τέλεια λύση, καθώς ανακατευθύνει το example.com/hello στο example.com/hello?layout=desktop&, το οποίο περιλαμβάνει ένα περιττό & στο τέλος του URL. Δεν είναι μεγάλο πρόβλημα γενικά, αλλά αν θέλετε να το αφαιρέσετε, μπορείτε να χρησιμοποιήσετε την Επεξεργασία Ομάδας Καταγραφής.
Συμπερασματικά, αυτό είναι το τελικό αποτέλεσμα:
- Ανακατεύθυνση Από:
(https://example.com/[^?]*)((\(.*))?)(Κανονική Έκφραση) - Ανακατεύθυνση Σε:
$1?layout=desktop$3 - Εξαιρούμενο Μοτίβο URL:
.*[&?]layout=[^&]*.*(Κανονική Έκφραση) - Επεξεργασία Ομάδας Καταγραφής:
- Ομάδα:
$3 - Διαδικασία: Αντικατάσταση Εμφανίσεων
- Στόχος:
\?(.*) - Αντικατάσταση:
&$1
- Στόχος:
- Ομάδα:
Αυτό είναι απλώς ένα παράδειγμα. Μπορείτε επίσης να δημιουργήσετε πολλούς κανόνες για να χειριστείτε κάθε πρόβλημα. Μπορεί να είναι πολύ πιο απλό.