.htaccess Rewrites – Κόλπα και συμβουλές

Το post που επιλέξαμε να γράψουμε ενδιαφέρει μόνο τους απανταχού προγραμματιστές και θα επιλύσει πολλά από τα προβλήματα τους.

Τα Htaccess Rewrites έχουν ενεργοποιηθεί με την χρήση του Apache mod_rewrite που είναι ένα από τα ισχυρότερα διαθέσιμα module. Τα Htaccess Rewrites μέσω του mod_rewrite παρέχουν την ειδική λειτουργία της επανεγγραφής αιτημάτων εσωτερικά αλλά και της ανακατεύθυνσης των αιτημάτων αυτών.

Όταν το url στην γραμμή διεύθυνσης του browser παραμένει ίδιο μετά από κάποιο αίτημα, τότε είναι εσωτερικό rewrite, ενώ όταν το url αλλάζει τότε συντελείται κάποια εξωτερική ανακατεύθυνση. Η κατανόηση της συγκεκριμένης λειτουργίας είναι το δύσκολο ‘κομμάτι’ γι αυτούς που μαθαίνουν για mod_rewrite.
Παρακάτω θα παραθέσουμε κάποιο ‘μυστικό όπλο’ το οποίο είναι προϊόν ανακάλυψης μετά από πολλά χρόνια έρευνας κάποιων ανθρώπων.
Θα πρέπει να ελέγξεις τα αρχεία mod_rewrite.c και mod_rewrite.h.
Σημείωσε ότι ο mod_rewrite (RewriteRule, RewriteBase και RewriteCond) κώδικας εκτελείται για κάθε αίτημα HTTP με το οποίο εισέρχεσαι σε ένα αρχείο στο (ή κάτω από το) directory όπου υπάρχει ο κώδικας, γι αυτό και είναι πάντα καλό να περιορίσεις τον κώδικα σε ορισμένες περιπτώσεις.
Για παράδειγμα για να περιορίσεις τα επόμενα 5 RewriteRules για να εφαρμόζονται μόνο σε .html και php αρχεία μπορείς να χρησιμοποιήσετε τον παρακάτω κώδικα ο οποίος ελέγχει αν η διεύθυνση url δεν τελειώνει σε .html ή .php. Εάν δεν το κάνει θα παραλείψεις τα επόμενα 5 RewriteRules.

RewriteRule !\.(html|php)$ - [S=5]
RewriteRule ^.*-(vf12|vf13|vf5|vf35|vf1|vf10|vf33|vf8).+$ - [S=1]

1. Τα παραδείγματα των .htaccess rewrite θα πρέπει να ξεκινούν με:

RewriteEngine On
RewriteBase /

2. Ανακατεύθυνση από non-www σε www:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.example\.gr$ [NC]
RewriteRule ^(.*)$ http://www.example.gr/$1 [R=301,L]

3. Ανακατεύθυνση σε https:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ http://www.example.gr/$1 [R=301,L]

4. Κώδικας διακοπής του Loop.

Μερικές φορές τα rewrite σας δημιουργούν ατελείωτα loops τα οποία μπορείς να σταματήσεις με τα παρακάτω:

RewriteCond %{REQUEST_URI} ^/(stats/|missing\.html|failed_auth\.html|error/).* [NC]
RewriteRule .* - [L]
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

5. Cache-Friendly ονόματα αρχείων.

Αυτό σου επιτρέπει να ενημερώσεις τα javascript και CSS αρχεία στην cache των επισκεπτών των site σου με το να δώσεις διαφορετικό όνομα στην html. Στον server παραμένουν τα ίδια.
Αυτό κάνει rewrite όλα τα αρχεία για /zap/j/anything-anynumber.js σε /zap/j/anything.js και /zap/c/anything-anynumber.css σε /zap/c/anything.css.

RewriteRule ^zap/(j|c)/([a-z]+)-([0-9]+)\.(js|css)$ /zap/$1/$2.$4 [L]

6. SEO friendly link για non-flash browsers.

Όταν χρησιμοποιείς flash στο site σου είναι καλό να χρησιμοποιείς κάποια συντόμευση έτσι ώστε να κρατήσεις τον κώδικα καθαρό και να ελαχιστοποιήσεις τα εξωτερικά link στο ελάχιστο.
Αυτός ο κώδικας σου επιτρέπει να συνδεθείς στο site.com / getflash / για browser που δεν υποστηρίζουν το flash:

RewriteRule ^getflash/?$ http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash [NC,L,R=307]

7. Αφαίρεση του Query_String.

Σε πολλά site, η σελίδα θα εμφανιστεί και με το page.html και με το  page.html?οτιδήποτε=οτιδήποτε κάτι το οποίο βλαπτει το SEO σου λόγω διπλού περιεχομένου.
Ένας εύκολος τρόπος για να το διορθώσεις αυτό είναι να ανακατευθύνεις τα εξωτερικά request που περιέχουν ενα query string στο ίδιο url χωρίς το query_string:

RewriteCond %{THE_REQUEST} ^GET /.*;.* HTTP/
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* http://www.example.gr%{REQUEST_URI}? [R=301,L]

8. Στέλνοντας requests σε ένα php script.

Αυτό το .htaccess rewrite παράδειγμα ξαναγράφει τα request για όλα τα αρχεία Adobe PDF τα οποία διαχειρίζεται το / cgi-bin/pdf-script.php:

RewriteRule ^(.+)\.pdf$  /cgi-bin/pdf-script.php?file=$1.pdf [L,NC,QSA]

9. Ρύθμιση της μεταβλητής γλώσσας που βασίζεται στον Client.

Για τα site που χρησιμοποιούν multiviews ή πολυγλωσσικές δυνατότητες, είναι καλό να μπορείς να στέλνεις την σωστή γλώσσα αυτόματα με βάση την γλώσσα προτίμησης του πελάτη:

RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC]
RewriteRule ^(.*)$ - [env=prefer-language:%1]

10. Απαγόρευσε την πρόσβαση σε οποιονδήποτε εκτός από το PHP fopen.

Αυτό επιτρέπει την πρόσβαση σε όλα τα αρχεία από την fopen php αλλά αρνείται την πρόσβαση σε οποιονδήποτε άλλον:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^.+$ [NC]
RewriteRule .* - [F,L]

11. Απαγόρευσε την πρόσβαση σε οτιδήποτε μέσα σε έναν υποφάκελο εκτός του php fopen:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+)/.* HTTP [NC]
RewriteRule .* - [F,L]

12. Δεν απαιτείται το www:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^example\.gr$ [NC]
RewriteRule ^(.*)$ http://example.gr/$1 [R=301,L]

13. Έλεγξε για κλειδί σε ένα QUERY_STRING.

Χρησιμοποιεί ένα RewriteCond Directive για να ελέγξει το QUERY_STRING για κλειδί πρόσβασης. Εάν δεν το βρει ανακατευθύνει όλα τα request που βρίσκονται στο  /logged-in/ κατάλογο, στο /login.php script.

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} !passkey
RewriteRule ^/logged-in/(.*)$ /login.php [L]

14. Απομακρύνει το QUERY_STRING από το url.

Εάν το QUERY_STRING έχει οποιαδήποτε τιμή εκτός του κενού τότε το ? στο τέλος του  /login.php? λέει το mod_rewrite να απομακρύνει το QUERY_STRING απο το login.php και να κάνει ανακατεύθυνση

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .
RewriteRule ^login\.php /login.php? [L]

15. Διόρθωση των ατελείωτων loop.

Ένα μήνυμα που σχετίζεται μ αυτό είναι το ‘Request exceeded the limit of 10 internal redirects due to probable configuration error. Use ‘LimitInternalRecursion’ to increase the limit if necessary. Use ‘LogLevel debug’ to get a backtrace.or you may seeRequest exceeded the limit,probable configuration error,Use ‘LogLevel debug’ to get a backtrace, orUse ‘LimitInternalRecursion’ to increase the limit if necessary’.

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

16. Εξωτερική ανακατεύθυνση php αρχείων σε html αρχείο (SEO friendly):

RewriteRule ^(.*)\.php$ /$1.html [R=301,L]

17. Εσωτερική ανακατεύθυνση php αρχείων σε html αρχείο (SEO friendly).

Ανακατευθύνει όλα τα αρχεία που καταλήγουν σε .html να ΄σερβίρονται’ από όνομα αρχείων.php. Έτσι φαίνεται ότι όλες οι σελίδες σου είναι .html ενώ στην πραγματικότητα είναι .php:

RewriteRule ^(.*)\.html$ $1.php [R=301,L]

18. Εμπόδισε την πρόσβαση σε αρχεία σε συγκεκριμένες ώρες της ημέρας:

RewriteEngine On
RewriteBase /
# If the hour is 16 (4 PM) Then deny all access
RewriteCond %{TIME_HOUR} ^16$
RewriteRule ^.*$ - [F,L]

19. Rewrite underscores σε hyphens για SEO URL.

Μετατρέπει όλα τα underscores ‘_’ από url σε ‘-‘ για λόγους SEO:

RewriteEngine On
RewriteBase /

RewriteRule !\.(html|php)$ - [S=4]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=uscor:Yes]
RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=uscor:Yes]

RewriteCond %{ENV:uscor} ^Yes$
RewriteRule (.*) http://example.gr/$1 [R=301,L]

20. Απαίτηση του www χωρίς hardcoding:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC]
RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$     [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]

21. Δεν απαιτείται subdomain:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} \.([^\.]+\.[^.0-9]+)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

22. Ανακατεύθυνση των WordPress Feeds στο Feedburner:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^/feed\.gif$
RewriteRule .* - [L]
RewriteCond %{HTTP_USER_AGENT} !^.*(FeedBurner|FeedValidator) [NC]
RewriteRule ^feed/?.*$ http://feeds.feedburner.com/apache/htaccess [L,R=302]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

23. Επίτρεψε μόνο τις request μεθόδους GET και PUT:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_METHOD} !^(GET|PUT)
RewriteRule .* - [F]

24. Απότρεψε τα image/file hotlinking και bandwidth stealing:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.gr/.*$ [NC]
RewriteRule \.(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

25. Σταμάτησε την ‘προαναζήτηση’ του browser:

RewriteEngine On
SetEnvIfNoCase X-Forwarded-For .+ proxy=yes
SetEnvIfNoCase X-moz prefetch no_access=yes

# block pre-fetch requests with X-moz headers
RewriteCond %{ENV:no_access} yes
RewriteRule .* - [F,L]
Share it!