Το 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\.pointer\.gr$ [NC]
RewriteRule ^(.*)$ http://www.pointer.gr/$1 [R=301,L]
3. Ανακατέυθυνση σε https
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ http://www.pointer.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.pointer.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} !^pointer\.gr$ [NC]
RewriteRule ^(.*)$ http://pointer.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://pointer.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\.)?pointer\.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]