Skip to main content

Περίπτωση 3: Προσθήκη παραμέτρων ερωτήματος στο URL

Ας υποθέσουμε ότι υπάρχει ένας ιστότοπος που ονομάζεται example.com ο οποίος εμφανίζει μια διάταξη για κινητά από προεπιλογή, αλλά εσείς προτιμάτε τη διάταξη για επιτραπέζιους υπολογιστές. Ευτυχώς, ο ιστότοπος υποστηρίζει μια παράμετρο ερωτήματος layout για να καθορίσει ποια διάταξη εμφανίζει ο ιστότοπος. Ας δημιουργήσουμε έναν κανόνα που προσθέτει αυτόματα layout=desktop.

Ίσως νομίζετε ότι θα μπορούσατε να το ορίσετε ως εξής:

  • Ανακατεύθυνση Από: https://example.com/.* (Κανονική Έκφραση)
  • Ανακατεύθυνση Σε: $0?layout=desktop

Το $0 αναφέρεται στο URL προορισμού. Αν προσπαθήσετε να αποκτήσετε πρόσβαση στο example.com/hello, ανακατευθύνεστε στο example.com/hello?layout=desktop. Αυτή η λειτουργία ονομάζεται αντικατάσταση.

tip

Η αντικατάσταση είναι επίσης διαθέσιμη για τη λειτουργία Μπαλαντέρ, καθώς μετατρέπεται εσωτερικά σε Κανονική Έκφραση.

Ωστόσο, υπάρχουν μερικά προβλήματα με αυτές τις ρυθμίσεις.

Πρόβλημα 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 μπορεί να σας βοηθήσει να κατανοήσετε τις λεπτομέρειες.

note

Το RegExr εμφανίζει ένα σφάλμα όταν δεν διαφεύγετε το / με \. Αν και μπορείτε να το διαφύγετε, δεν απαιτείται, καθώς το RedirectWeb χρησιμοποιεί μια διαφορετική μηχανή της Apple που δεν απαιτεί διαφυγή.

Αυτή δεν είναι μια τέλεια λύση, καθώς ανακατευθύνει το example.com/hello στο example.com/hello?layout=desktop&, το οποίο περιλαμβάνει ένα περιττό & στο τέλος του URL. Δεν είναι μεγάλο πρόβλημα γενικά, αλλά αν θέλετε να το αφαιρέσετε, μπορείτε να χρησιμοποιήσετε την Επεξεργασία Ομάδας Καταγραφής.

Συμπερασματικά, αυτό είναι το τελικό αποτέλεσμα:

  • Ανακατεύθυνση Από: (https://example.com/[^?]*)((\(.*))?) (Κανονική Έκφραση)
  • Ανακατεύθυνση Σε: $1?layout=desktop$3
  • Εξαιρούμενο Μοτίβο URL: .*[&?]layout=[^&]*.* (Κανονική Έκφραση)
  • Επεξεργασία Ομάδας Καταγραφής:
    • Ομάδα: $3
    • Διαδικασία: Αντικατάσταση Εμφανίσεων
      • Στόχος: \?(.*)
      • Αντικατάσταση: &$1

⬇️ Λήψη του Κανόνα

Αυτό είναι απλώς ένα παράδειγμα. Μπορείτε επίσης να δημιουργήσετε πολλούς κανόνες για να χειριστείτε κάθε πρόβλημα. Μπορεί να είναι πολύ πιο απλό.