Redirect con .htaccess dalla directory cgi-bin: un caso particolare

E' passato un po' di tempo da quando ho scritto questo articolo.
Il mondo del digital è sempre in evoluzione e potresti trovare delle informazioni non più aggiornate.

In questo ultimo periodo mi sono imbattuto in un caso particolare per le redirezioni 301 che volevo condividere: lo so che magari è un caso remoto, ma come diceva mia nonna "taa vita no se sa mai" :-).

Situazione iniziale:

Un cliente sta per effettuare la pubblicazione del suo nuovo sito ed bisogna effettuare tutto il piano di migrazione delle URL attraverso l’ormai fantomatico .htaccess.

301-redirect

Immagine tratta da searchengineland.com

Le pagine prodotto del vecchio sito vengono generate attraverso uno script lato server che risiede nella directory cgi-bin.

Quindi, per effettuare le redirezioni dai vecchi ai nuovi contenuti avrei dovuto inserire all’interno dell’.htaccess delle regole ‘RewriteRule’ del tipo:

RewriteRule /cgi-bin/prodotto_1 http://www.miosito.it/nuova/prodotto_1.html

Problema

Sembrerebbe un’operazione di routine ma dopo una serie di test andati ad esito negativo si nota come le regole impostate nella directory cgi-bin non vengano processate da Apache.

La sintassi, però, è corretta in quanto le stesse regole su un percorso di partenza ‘cgibin’ anzichè ‘cgi-bin’ venivano processate e redirette nel modo corretto.

Significa, quindi, che Apache nell'elaborazione delle RewriteRule applica un’eccezione nella gestione della cartella cgi-bin.

La cartella cgi-bin non è come tutte le altre, infatti, è quella che viene utilizzata per memorizzare gli script CGi lato server. Nel file httpd.conf tale directory è oggetto di un’impostazione particolare, ovvero di un ScriptAlias che istruisce il web server a processare le richieste nel path di origine alla directory del file system locale del server.
Esempio:
ScriptAlias /cgi-bin/ /web/cgi-bin/
Una richiesta per un URL all'interno di http://www.miosito.it/cgi-bin/script verrà processata dal file sul web server di percorso /web/cgi-bin/script.

Quindi il web server non effettua alcuna redirezione poiché l’httpd.conf processa la richiesta HTTP direttamente in locale, ancora prima di eseguire mod_rewrite e quindi la redirezioni .htaccess.

Come agire

Per poter redirigere le richieste HTTP in questo caso non è sufficiente agire sul file .htaccess, bensì è necessario agire a livello di httpd.conf in due modi:

1- Disabilitare ScriptAlias

Si disabilita la direttiva ScriptAlias, se non necessaria ai fini del funzionamento delle applicazioni web:

#ScriptAlias /cgi-bin/ /web/cgi-bin/

2- Doppia redirezione usando una cartella fake

Se l'impostazione della directory come ScriptAlias determina un vincolo per il funzionamento dei vostri sistemi, si può aggirare l'ostacolo attraverso l'inserimento di una direttiva Redirectmatch nel file httpd.conf prima del settaggio dello ScriptAlias. In questo modo verrà effettuata una redirezione 301 con successo prima che il file di configurazione faccia processare al webserver le richieste HTTP direttamente in locale. La directory verso il quale dovrebbe essere fatta la ridirezione potrebbe essere un nome fake come 'redirect'.

Nel caso esposto, una possibile applicazione potrebbe essere la sostituzione nell'URL della stringa 'cgi-bin' con la stringa fake "redirect"

RedirectMatch 301 /cgi-bin/prodotto_(.+) http://localhost/redirect/prodotto_$1

A questo punto non resta altro che riprendere le regole nel file .htaccess non funzionanti e sostituire cgi-bin con redirect:

RewriteRule /redirect/prodotto_1 http://www.miosito.it/nuova/prodotto_1.html

Ricapitolando il flusso delle redirezioni consta quindi di due ridirezioni 301 e la comunicazione via HTTP diventa:

  1. il client fa una richiesta all'URL www.miosito.it/cgi-bin/prodotto_1;
  2. il server risponde con status code 301 e la nuova URL www.miosito.it/redirect/prodotto_1 attraverso la direttiva nel httpd.conf;
  3. il client richiede l'URL www.miosito.it/redirect/prodotto_1;
  4. il server risponde con la seconda redirezione 301 e la nuova URL www.miosito.it/nuova/prodotto_1.html attraverso la direttiva del file .htaccess;
  5. il client richiede www.miosito.it/nuova/prodotto_1.html e riceve il nuovo file all'URL corretta.

Sicuramente questo tipo di redirezioni carica molto il server poichè causa la gestione di 3 richieste HTTP anzichè 2, ma è un buon modo per aggirare l'ostacolo ed effettuare le ridirezioni anche in questo caso particolarmente spinoso.

Link utili:

Sperando di essere stato abbastanza chiaro nell'argomentazione, ti linko altro materiale utile per i redirect con Apache e .htaccess:

Altri post che potrebbero interessarti: