301 Redirects with greek characters in the URL

Μπορεί να χρειαστεί κάποια στιγμή να κάνετε 301 redirects σε αρχείο htaccess αλλά με URL που περιλαμβάνουν ελληνικούς χαρακτήρες. Εκεί λοιπόν θα ανακαλύψετε ότι τα πράγματα δεν είναι και τόσο εύκολα..

Θα έχετε φυσικά παρατηρηρήσει ότι τα url με ελληνικούς χαρακτήρες αν τα κάνετε copy-paste αλλάζουν απο πχ
https://www.elementia.gr/τεστ/
σε
https://www.elementia.gr/%CF%84%CE%B5%CF%83%CF%84/

Aς υποθέσουμε λοιπόν ότι θέλω να κάνω redirect 301 (δηλαδή μόνιμη ανακατεύθυνση) την παραπάνω σελίδα σε ένα άλλο domain με πάλι ελληνικούς χαρακτήρες στο URL της, για παράδειγμα στο http://www.somedomain.gr/δοκιμαστική-σελίδα/ το οποίο γίνεται encoded σε http://www.somedomain.gr/%CE%B4%CE%BF%CE%BA%CE%B9%CE%BC%CE%B1%CF%83%CF%84%CE%B9%CE%BA%CE%AE-%CF%83%CE%B5%CE%BB%CE%AF%CE%B4%CE%B1/

Oι παρακάτω γραμμές στο htaccess δεν δουλεύουν

RewriteEngine On
RewriteRule ^/τεστ/?$ “http://www.somedomain.gr/δοκιμαστική-σελίδα/” [R=301,L]

όπως ούτε και οι αντίστοιχες με τα encoded urls

RewriteRule ^/%CF%84%CE%B5%CF%83%CF%84/?$ “http://www.somedomain.gr/%CE%B4%CE%BF%CE%BA%CE%B9%CE%BC%CE%B1%CF%83%CF%84%CE%B9%CE%BA%CE%AE-%CF%83%CE%B5%CE%BB%CE%AF%CE%B4%CE%B1/” [R=301,L]

Η λύση είναι
1. να κάνουμε escape το σύμβολο % στο αρχικό url string οπότε όπου % αλλάζουμε με \x
2. να δηλώσουμε το flag NE έτσι ώστε στο target url να μην γίνεται escape το output

Οπότε η εντολή μας γίνεται

RewriteRule ^\xCF\x84\xCE\xB5\xCF\x83\xCF\x84/?$ “http://www.somedomain.gr/%CE%B4%CE%BF%CE%BA%CE%B9%CE%BC%CE%B1%CF%83%CF%84%CE%B9%CE%BA%CE%AE-%CF%83%CE%B5%CE%BB%CE%AF%CE%B4%CE%B1/” [R=301,L,NE]

και happy redirecting τα ελληνικά urls σας 🙂