Archivi tag: cookie

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.

Upgrade di un router Cisco da SOHO 77 a 827

Premessa

Per effettuare l’upgrade del nostro router da SOHO 77 a 827 è necessario che esso soddisfi i requisiti hw richiesti dalla IOS che abbiamo intenzione di installare.

Se ad esempio la IOS implementa diverse feature, come un firewall, la possibilità di gestire il traffico VOIP o di realizzare VPN PPTP, i requisiti in termini di RAM potrebbero superare di gran lunga quelli in dotazione al nostro router. Un ostacolo ancora maggiore potrebbe essere rappresentato dalle dimensioni della memoria flash (solitamente 8 MB), dunque è impossibile installarci sopra una IOS che abbia dimensioni superiori agli 8 MB.

Esistono, ovviamente, dei moduli di espansione per la flash (piuttosto costosi), mentre per la RAM potete utilizzare un banco di SDRAM a 100pin PC100 dalla capacità di 32 MB (per intenderci, quella installata sulle stampanti). Per la precisione anche un banco di RAM a 64 MB va bene, sappiate però che il router riuscirà a leggere (e quindi ad utilizzare) solo 48 MB dei 64 disponibili.

Upgrade della piattaforma

Ma vediamo come far digerire al nostro SOHO 77 una IOS sviluppata per l’827.

Spegniamo il router e riaccendiamolo. Una volta avviata la fase di boot teniamo premuto CTRL+PAUSA, in modo di accedere al rom monitor.

cisco827.jpg

 

Successivamente, il prompt ci apparirà nel modo seguente:

rommon 1 >

Per avere una lista dei comandi disponibili è sufficiente digitare ?:

rommon 1 > ?
alias               set and display aliases command
boot                boot up an external process
break               set/show/clear the breakpoint
confreg             configuration register utility
cont                continue executing a downloaded image
context             display the context of a loaded image
cookie              display contents of cookie PROM in hex
dev                 list the device table
dir                 list files in file system
dis                 display instruction stream
dnld                serial download a program module
frame               print out a selected stack frame
help                monitor builtin command help
history             monitor command history
meminfo             main memory information
repeat              repeat a monitor command
reset               system reset
set                 display the monitor variables
stack               produce a stack trace
sync                write monitor environment to NVRAM
sysret              print out info from last system return
tftpdnld            tftp image download
unalias             unset an alias
unset               unset a monitor variable
xmodem              x/ymodem image download
rommon 2 >

Ora, per fare l’upgrade del router occorre visualizzare il cookie che identifica la piattaforma. Per fare ciò basta digitare il comando cookie:

rommon 2 > cookie
cookie:
01 01 00 01 96 71 b4 61 5b 00 01 00 01 ff 00 00
00 00 00 00 00 00 00 00 4a 41 44 04 33 30 47 39
59 05 01 00 00 00 00 00 00 ff ff ff 60 04 49 11
ec 03 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

A noi interessa modificare ESCLUSIVAMENTE il nono byte, portandolo da 5b a 3e. Tutti gli altri byte possono rimanere inalterati.

Per modificare il cookie occorre entrare in modalità privilegiata. E’ dunque necessario digitare il comando priv con relativa password, dove la password può essere calcolata mediante questo tool, dandogli in pasto solo la prima riga del cookie sopra riportato.

Una volta ottenuta la password utilizziamola per accedere alla modalità privilegiata. Riceveremo in output il seguente messaggio:

You now have access to the full set of monitor commands.
Warning: some commands will allow you to destroy your
configuration and/or system images and could render
the machine unbootable.
rommon 4 >

Digitiamo nuovamente il comando cookie per procedere con la modifica di quest’ultimo:

rommon 4 > cookie

View/alter bytes of serial cookie by field --
Input hex byte(s) or: CR -> skip field; ? -> list values
byte  0x00       - version: 01
                          >

Per lasciare inalterati i valori di default ci basterà premere INVIO. Per la precisione dobbiamo modificare solo il nono byte, il cui valore dovrà essere 3e.

Una volta terminata la modifica del cookie, possiamo installare la IOS dell’827 mediante il comando tftpdnld. Prima di utilizzarlo, però, si dovranno settare alcune variabili di sistema che tale comando utilizzerà, ovvero:

IP_ADDRESS

IP_SUBNET_MASK

DEFAULT_GATEWAY

TFTP_SERVER

TFTP_FILE

Ad esempio:

IP_ADDRESS=192.168.1.2

IP_SUBNET_MASK=255.255.255.0

DEFAULT_GATEWAY=192.168.1.1

TFTP_SERVER=192.168.1.1

TFTP_FILE=c827v-y6-mz.121-1.XB.bin

Controlliamo che le variabili siano state impostate correttamente digitando semplicemente set.

Adesso procediamo con il download dell’IOS mediante tftpdnld (come applicativo che funga da server TFTP vi consiglio di utilizzare tftp32):

rommon 10 > tftpdnld

          IP_ADDRESS: 192.168.1.2
      IP_SUBNET_MASK: 255.255.255.0
     DEFAULT_GATEWAY: 192.168.1.1
         TFTP_SERVER: 192.168.1.1
           TFTP_FILE: c827v-y6-mz.121-1.XB.bin

Invoke this command for disaster recovery only.
WARNING: all existing data in all partitions on flash will be lost!
Do you wish to continue? y/n:  [n]:

Digitiamo y e proseguiamo con l’installazione:

Receiving c827v-y6-mz.121-1.XB.bin from 192.168.1.1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
File reception completed.
Copying file c827v-y6-mz.121-1.XB.bin to flash.

Erasing flash ................................................................
Programming flash ..............................

Digitiamo reset per riavviare il router e finalmente il nostro 827 è (o dovrebbe) essere pronto per l’uso.

A presto.