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 εμφανίζει ένα σφάλμα όταν δεν διαφεύγετε το / με \. Αν και μπορείτε να το διαφύγετε, δεν απαιτείται, καθώς το Redirect Web χρησιμοποιεί μια διαφορετική μηχανή της Apple που δεν απαιτεί διαφυγή.

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

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

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

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

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