Drupal πίσω από reverse proxy; Εύκολα!

reverse proxy

Αν είσαι Web Developer, τότε πολλές φορές θα σου τύχει να πρέπει το script σου να ξέρει ποια είναι η IP του επισκέπτη σου. Είτε για λόγους debugging, είτε για κάποιο functionality του site, δεν έχει σημασία.

Πιθανές προσεγγίσεις

Αν είσαι άπειρος στο Drupal, θα κάνεις κάτι τέτοιο:

if ($_SERVER['REMOTE_ADDR'] =='1.2.3.4'){// Your code here }

Αν έχεις λίγη εμπειρία παραπάνω, θα κάνεις κάτι τέτοιο:

if (ip_address() =='1.2.3.4'){// Your code here }

Το πρόβλημα

Τι γίνεται όμως όταν το site μας παίζει πίσω από κάποιον reverse proxy; Για παράδειγμα πίσω από Varnish ή από Nginx; Ή αν είσαι πίσω από την Cloudflare; Και δεν είναι δικός σου ο server να εγκαταστήσεις ένα mod_rpaf; Και είναι 3:00 τα χαράματα και δεν μπορείς να ενοχλήσεις τον administrator;
Καμία από τις παραπάνω λύσεις δεν θα σου δείξει την πραγματική διεύθυνση IP του επισκέπτη σου.

Η λύση

Το Drupal έχει λύση και για αυτό, και είναι κάτω από την μύτη μας!

Αν ανοίξουμε το αρχείο sites/default/settings.php, θα δούμε ότι υπάρχει σχετική ενότητα για το reverse proxy configuration.
Τα βήματα απλά:

1. Κάνουμε comment out την γραμμή $conf['reverse_proxy'] = TRUE; 2. Βάζουμε σε ένα array τις γνωστές IP του reverse proxy. Στην περίπτωση ενός Varnish ή Nginx, συνήθως είναι η ίδια IP του server που φιλοξενεί το site μας.
Στην περίπτωση του Cloudflare (ή κάποιας άλλης υπηρεσίας),θα πρέπει να πάρουμε την λίστα των IP από την υπηρεσία αυτή ώστε να την βάλουμε στον πίνακα:
$conf['reverse_proxy_addresses'] = array('a.b.c.d', ...); 3. Βάζουμε το header που ο proxy χρησιμοποιεί για να "κουβαλάει" την IP του επισκέπτη στο script μας. Εξ ορισμού είναι το HTTP_X_FORWARDED_FOR.
Σε περίπτωση που δεν είναι το HTTP_X_FORWARDED_FOR, μπορούμε εύκολα να βρούμε ποιο header χρησιμοποιείται τρέχοντας στο script μας ένα:

print '<pre>'; print_r($_SERVER); print '</pre>';

 

Δες που είναι η IP σου και βάλε το header στην μεταβλητή:
$conf['reverse_proxy_header'] ='HTTP_X_CLUSTER_CLIENT_IP';

Κάνοντας όλα τα παραπάνω, η συνάρτηση ip_address(),θα μας επιστρέφει την IP του επισκέπτη. 

Απλά και συμμαζεμένα!

Μιχάλης

Γράφει ο Μιχάλης

Web Developer

Δημοσιεύθηκε την 18.05.2015

Σχολιάστε το άρθρο