2009-10-07 10:03

Dans un billet précédent, je détaillais comme mettre en place une redirection mobile basée sur l’en-tête HTTP User-Agent, avec Squid. Exemple : quand un mobile se rend sur www.monsite.com, il est redirigé vers mobile.monsite.com.

Maintenant, nous désirons ajouter un lien sur mobile.monsite.com qui permette d’accéder au site en mode normal (www.monsite.com).

Problème : la redirection est en place, et dès que le mobile retournera sur www.monsite.com, il sera redirigé de nouveau.

Solution : en se basant sur l’en-tête HTTP Referer, on ne redirige pas les mobiles quand l’utilisateur vient du domaine *.monsite.com

Réalisé de la manière suivante dans la configuration Squid :

###################################
# on redirige les telephones vers mobile.monsite.com
url_rewrite_program /etc/squid/redirect_mobile.sh

acl symbian browser Symbian
acl iphone browser iP(hone|od)
acl android browser Android
acl mobile_url dstdomain mobile.monsite.com
acl from_monsite referer_regex ^http\://[^/]+\.monsite\.com   # on teste si l'utilisateur vient de *.monsite.com

url_rewrite_access deny mobile_url
url_rewrite_access deny from_monsite   # on ne redirige pas quand c'est le cas
url_rewrite_access allow symbian
url_rewrite_access allow iphone
url_rewrite_access allow android
url_rewrite_access deny all

De cette manière, si le mobile vient de l’extérieur (d’un moteur de recherche ou autre site, ou qu’il tape directement l’URL dans la barre d’adresse), il sera redirigé. En revanche, s’il a cliqué sur un lien « www.monsite.com en mode normal » depuis mobile.monsite.com, il ne sera pas redirigé.

Note :
Cette solution est aisément transposable en règles de réécriture apache.

2009-10-07 10:03 · Tags: , ,
2009-07-30 15:46

Dans la grande majorité des cas, les redirections http sont installée sur le serveur http.
Dans certains cas, la redirection ne peut pas être installée dans la configuration du serveur http.

Exemple : redirection pour les téléphones mobiles.
Nous voulons rediriger tous les téléphones mobiles de http://www.monsite.com vers http://mobile.monsite.com

L’identification du client se fait avec l’en-tête HTTP User-Agent envoyée par le navigateur. Le problème est que Squid va mettre en cache une seule version de la requête vers http://www.monsite.com. La réponse mise en cache sera probablement la page d’accueil, et non la redirection 301.

Il est aussi possible de configurer le serveur HTTP pour ajouter l’en-tête Vary: User-Agent pour indiquer au Squid de stocker une version par navigateur, mais cela aura pour effet de diviser le cache en autant de navigateurs, ce qui diminuera grandement l’efficacité du cache.

Voici donc la solution :

###################################
# on redirige les telephones vers mobile.monsite.com
url_rewrite_program /etc/squid/redirect_mobile.sh

acl symbian browser Symbian
acl iphone browser iP(hone|od)
acl mobile_url dstdomain mobile.monsite.com

url_rewrite_access deny mobile_url
url_rewrite_access allow symbian
url_rewrite_access allow iphone
url_rewrite_access deny all

Et le script /etc/squid/redirect_mobile.sh contient simplement:

#!/bin/sh
while read line
do
        echo "301:http://mobile.monsite.com"
done

Notes :

  • La méthode de détection des téléphone est loin d’être exhaustive. Si vous connaissez une méthode simple qui couvre 95% des téléphones, je suis preneur !
  • Sous des version plus récentes de Squid (3, 2.HEAD), il est possible d’utiliser une méthode plus élégante à base de redirecteurs internes.

Liens :

2009-07-30 15:46 · Tags: , ,