Archivi tag: mobile

Apache e mod_rewrite: redirect automatico per i dispositivi di tipo mobile

Scenario

Un sito Web, chiamiamolo per semplicità www.domain.com, che prevede due versioni: una per i desktop computer (e simili) e l’altra per i dispositivi mobile (smartphone, tablet, ecc.).

In particolare, i dispositivi mobile devono essere reindirizzati automaticamente su una landing page (choose.domain.com) e da questa pagina consentire all’utente di scegliere quale versione del sito visualizzare.

Soluzione

La soluzione da me implementata prevede l’identificazione dei client mobile (basata fondamentalmente sullo User Agent), il redirect degli stessi verso la landing page (mediante mod_rewrite) ed il settaggio di un cookie per “ricordare” la versione del sito che l’utente ha scelto di visualizzare (ovviamente fino a quando il cookie non scadrà o verrà rimosso volutamente dall’utente stesso).

mod_rewrite_logoMa bando alle ciance ed ecco la configurazione:

#Redirect per Iphone, Ipad, Android
 RewriteCond %{HTTP_USER_AGENT} "iPhone|iPad|Android" [NC]
 RewriteCond %{QUERY_STRING} !^full=true$ [NC]
 RewriteCond %{HTTP_COOKIE} !^.*full.*$ [NC]
 RewriteRule ^(.*)$ http://choose.domain.com [R=301,L]
RewriteCond %{QUERY_STRING} ^full=true$ [NC]
 RewriteCond %{HTTP_COOKIE} !^.*full.*$ [NC]
 RewriteRule .* - [co=full:true:.domain.com:7200:/]

Analizziamola direttiva per direttiva. Con:

RewriteCond %{HTTP_USER_AGENT} "iPhone|iPad|Android" [NC]

verifico che lo User Agent del visitatore contenga una delle keyword elencate (ed intervallate da semplici OR logici), ovvero iPhone, iPad ed Android.

Successivamente mi accerto che il link contattato dall’utente non contenga la querystring ?full=true

RewriteCond %{QUERY_STRING} !^full=true$ [NC]

il punto esclamativo (!) all’inizio della rewrite condition indica la negazione. Verifico inoltre che sul browser dell’utente non vi siano cookie contenenti la stringa full:

RewriteCond %{HTTP_COOKIE} !^.*full.*$ [NC]

Infine, se tutte e 3 le condizioni fin’ora elencate sono vere (le rewrite conditions elencate una dopo l’altra prevedono l’AND implicito), eseguo un redirect permanente (HTTP 301) sulla landing page:

RewriteRule ^(.*)$ http://choose.domain.com [R=301,L]

Nel caso in cui, invece, il link contattato dall’utente contenga la querystring ?full=true:

RewriteCond %{QUERY_STRING} ^full=true$ [NC]

ed il browser da egli utilizzato non presenti cookie che rechino la keyword full:

RewriteCond %{HTTP_COOKIE} !^.*full.*$ [NC]

salvo nel suddetto browser un cookie che ricordi la sua scelta, ovvero quella di visualizzare il sito in versione desktop (full), fino a quando il cookie stesso non sarà scaduto (dopo 7200 minuti, ovvero 5 giorni):

RewriteRule .* - [CO=full:true:.domain.com:7200:/]

dove la flag di mod_rewrite utilizzata è banalmente CO, la cui sentassi è la seguente:

[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]

che ho utilizzato nella forma ridotta:

[CO=NAME:VALUE:DOMAIN:lifetime:path]

Infine, la flag [NC] utilizzata al termine di ciascuna rewrite condition, consente di non fare distinzione tra caratteri maiuscoli e minuscoli (NC, infatti, sta per NO CASE).

Per ora è tutto, alla prossima.