Introduzione

Il modulo mod_rewrite di Apache ti consente di riscrivere gli URL in modo più pulito, traducendo percorsi leggibili dall'uomo in stringhe di query compatibili con il codice. Consente inoltre di riscrivere gli URL in base alle condizioni.

Un file .htaccess consente di creare e applicare regole di riscrittura senza accedere ai file di configurazione del server. Posizionando il file .htaccess nella root del tuo sito web, puoi gestire le riscritture per sito o per directory.

In questo tutorial, abiliterai mod_rewrite e utilizzerai i file .htaccess per creare un reindirizzamento URL di base, quindi esplorerai un paio di casi d'uso avanzati.

Se desideri installare mod_rewrite per Apache su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Prerequisiti

Per seguire questo tutorial, avrai bisogno di:

Attivare il modulo mod_rewrite

Affinché Apache possa comprendere le regole di riscrittura, dobbiamo prima attivare mod_rewrite. È già installato di default, ma è disabilitato su un'installazione predefinita di Apache. Usa il comando a2enmod per abilitare il modulo:

sudo a2enmod rewrite

Questo attiverà il modulo o ti avviserà che il modulo è già abilitato. Per rendere effettive queste modifiche, riavvia Apache.

sudo systemctl restart apache2

mod_rewrite è ora completamente abilitato. Nel passaggio successivo, imposteremo un file .htaccess che useremo per definire le regole di riscrittura per i reindirizzamenti.

Configurare il file .htaccess

Un file .htaccess ci consente di modificare le nostre regole di riscrittura senza accedere ai file di configurazione del server. Per questo motivo, .htaccess è fondamentale per la sicurezza della tua applicazione web. Il punto che precede il nome del file garantisce che il file sia nascosto.

Nota: qualsiasi regola che è possibile inserire in un file .htaccess può anche essere inserita direttamente nei file di configurazione del server. In effetti, la documentazione ufficiale di Apache consiglia di utilizzare i file di configurazione del server anziché .htaccess perché Apache lo elabora più velocemente in questo modo. Tuttavia, in questo semplice esempio, l'aumento delle prestazioni sarà trascurabile. Inoltre, l'impostazione delle regole .htaccess è conveniente, soprattutto con più siti Web sullo stesso server. Non richiede un riavvio del server affinché le modifiche abbiano effetto e non richiede privilegi di root per modificare quelle regole, semplificando la manutenzione e rendendo possibili modifiche con un account non privilegiato. Alcuni popolari software open source, come WordPress e Joomla, spesso si affidano a un file .htaccess affinché il software modifichi e crei regole aggiuntive su richiesta.

Prima di iniziare a utilizzare i file .htaccess, è necessario configurare e proteggere alcune altre impostazioni.

Per impostazione predefinita, Apache vieta l'utilizzo di un file .htaccess per applicare le regole di riscrittura, quindi prima è necessario consentire le modifiche al file. Apri il file di configurazione di Apache predefinito utilizzando nano o il tuo editor di testo preferito:

sudo nano /etc/apache2/sites-available/000-default.conf

All'interno di quel file, troverai un blocco <VirtualHost *:80> che inizia dalla prima riga. All'interno di quel blocco, aggiungi il seguente nuovo blocco in modo che il tuo file di configurazione sia simile al seguente. Assicurati che tutti i blocchi siano correttamente rientrati:

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    . . .
</VirtualHost>
/etc/apache2/sites-available/000-default.conf

Salva e chiudi il file. Per rendere effettive queste modifiche, riavvia Apache:

sudo systemctl restart apache2

Ora, crea un file .htaccess nel file webroot:

sudo nano /var/www/html/.htaccess

Aggiungi questa riga all'inizio del nuovo file per attivare il motore di riscrittura:

RewriteEngine on
/var/www/html/.htaccess

Salva il file ed esci.

Ora abbiamo un file .htaccess operativo che possiamo usare per governare le regole di instradamento della nostra applicazione web. Nel passaggio successivo, creeremo file di sito Web di esempio che utilizzeremo per dimostrare le regole di riscrittura.

Configurare le riscritture degli URL

Qui, imposteremo una riscrittura URL di base che converte i pretty URL in percorsi effettivi delle pagine. Nello specifico, consentiremo agli utenti di accedere, ma visualizzeremo una pagina chiamata http://your_server_ip/aboutabout.html.

Inizia creando un file denominato about.html in webroot:

sudo nano /var/www/html/about.html

Copia il seguente codice HTML nel file, quindi salvalo e chiudilo:

<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>
/var/www/html/about.html

Puoi accedere a questa pagina all'indirizzo http://your_server_ip/about.html, ma nota che se provi ad accedere a http://your_server_ip/about, vedrai un errore 404 Not Found. Per accedere alla pagina utilizzando invece /about, creeremo una regola di riscrittura.

Tutte le regole RewriteRules seguono questo formato:

RewriteRule pattern substitution [flags]
  • RewriteRule - specifica la direttiva.
  • pattern - è un'espressione regolare che corrisponde alla stringa desiderata dall'URL, che è ciò che il visualizzatore digita nel browser.
  • substitution - è il percorso dell'URL effettivo, ovvero il percorso del file server Apache.
  • flags - sono parametri opzionali che possono modificare il funzionamento della regola.

Creiamo la nostra regola di riscrittura URL. Apri il file .htaccess:

sudo nano /var/www/html/.htaccess

Dopo la prima riga, aggiungi l'elemento evidenziato RewriteRule e salva il file:

RewriteEngine on
RewriteRule ^about$ about.html [NC]
/var/www/html/.htaccess

In questo caso, ^about$ è il modello, about.html è la sostituzione ed [NC] è un flag. Il nostro esempio utilizza alcuni caratteri con un significato speciale:

  • ^ - indica l'inizio dell'URL dopo your_server_ip/.
  • $ - indica la fine dell'URL.
  • about - corrisponde alla stringa "about".
  • about.html - è il file effettivo a cui l'utente accede.
  • [NC] - è un flag che rende la regola insensibile al maiuscolo/minuscolo.

Ora puoi accedere a http://your_server_ip/aboutabout.html nel tuo browser. Infatti, con la regola mostrata sopra, i seguenti URL punteranno a:

  • http://your_server_ip/about, a causa della definizione della regola.
  • http://your_server_ip/About, perché la regola non fa distinzione tra maiuscole e minuscole.
  • http://your_server_ip/about.html, perché il nome file originale corretto funzionerà sempre.

Tuttavia, quanto segue non funzionerà:

  • http://your_server_ip/about/, perché la regola afferma esplicitamente che potrebbe non esserci nulla dopo about, poiché il carattere $ appare dopo about.
  • http://your_server_ip/contact, perché non corrisponderà alla stringa about nella regola.

Ora hai un file .htaccess operativo con una regola di base che puoi modificare ed estendere alle tue esigenze. Nelle sezioni seguenti, mostreremo due ulteriori esempi di direttive di uso comune.

Semplificare le Query Strings con RewriteRule

Le applicazioni Web spesso utilizzano Query Strings, che vengono aggiunte a un URL utilizzando un punto interrogativo (?) dopo l'indirizzo. I parametri separati vengono delimitati utilizzando una e commerciale (&). Le stringhe di query possono essere utilizzate per passare dati aggiuntivi tra le singole pagine dell'applicazione.

Ad esempio, una pagina dei risultati di ricerca scritta in PHP può utilizzare un URL come http://example.com/results.php?item=shirt&season=summer. In questo esempio, due parametri aggiuntivi vengono passati allo script result.php dell'applicazione: item con il valore shirt e season con il valore summer. L'applicazione può utilizzare le informazioni della stringa di query per creare la pagina giusta per il visitatore.

Le regole di riscrittura di Apache vengono spesso impiegate per semplificare collegamenti così lunghi e sgradevoli come i precedenti in URL friendly che sono più facili da digitare e interpretare visivamente. In questo esempio, vorremmo semplificare il collegamento di esempio precedente e farlo diventare in questo modo http://example.com/shirt/summer. I valori dei parametri shirt e summer si trovano ancora nell'indirizzo ma senza la stringa di query e il nome dello script.

Ecco una regola per implementare questo meccanismo:

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

Il valore shirt/summer è esplicitamente abbinato nell'indirizzo richiesto e al suo posto viene detto ad Apache di servire results.php?item=shirt&season=summer .

I flag [QSA] sono comunemente usati nelle regole di riscrittura. Dicono ad Apache di aggiungere qualsiasi stringa di query aggiuntiva all'URL servito, quindi se il visitatore digita http://example.com/shirt/summer?page=2 il server risponderà results.php?item=shirt&season=summer&page=2. Senza di essa, la stringa di query aggiuntiva verrebbe eliminata.

Sebbene questo metodo raggiunga l'effetto desiderato, sia il nome dell'articolo che la stagione sono codificati nella regola. Ciò significa che la regola non funzionerà per altri elementi, come pants o stagioni, come winter.

Per rendere la regola più generica, possiamo usare espressioni regolari per abbinare parti dell'indirizzo originale e usare quelle parti in uno schema di sostituzione. La regola modificata apparirà quindi come segue:

RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

Il primo gruppo di espressioni regolari tra parentesi corrisponde a una stringa contenente caratteri alfanumerici e numeri come shirt o pants e salva il frammento corrispondente come variabile $1. Il secondo gruppo espressione regolare tra parentesi corrisponde esattamente summer, winter, fall, o spring, allo stesso modo e salva il frammento abbinato come $2.

I frammenti corrispondenti vengono quindi utilizzati nell'URL risultante in item e nelle variabili season anziché nei valori hardcoded shirt e nei valori summer utilizzati in precedenza.

Quanto sopra si convertirà, ad esempio, http://example.com/pants/summer in http://example.com/results.php?item=pants&season=summer. Questo esempio è anche una prova futura, consentendo di riscrivere correttamente più articoli e stagioni utilizzando un'unica regola.

Aggiungere condizioni con logica utilizzando RewriteConds

Le regole di riscrittura non sono necessariamente sempre valutate una per una senza limitazioni. La direttiva RewriteCond ci consente di aggiungere condizioni alle nostre regole di riscrittura per controllare quando le regole vengono elaborate. Tutte le condizioni RewriteConds rispettano il seguente formato:

Struttura generale di RewriteCond:

RewriteCond TestString Condition [Flags]
  • RewriteCond - specifica la direttiva RewriteCond.
  • TestString - è la stringa su cui eseguire il test.
  • Condition - è il modello o la condizione da abbinare.
  • Flags - sono parametri opzionali che possono modificare la condizione e le regole di valutazione.

Se RewriteCond restituisce true, verrà considerata immediatamente la RewriteRule che segue. In caso contrario, la regola verrà scartata. Più RewriteCond possono essere utilizzate una dopo l'altra e, con il comportamento predefinito, tutte devono essere valutate come true affinché la regola seguente venga considerata.

Ad esempio, supponiamo che desideri reindirizzare tutte le richieste a file o directory inesistenti sul tuo sito alla home page invece di mostrare la pagina di errore 404 Not Found standard. Ciò può essere ottenuto con le seguenti regole delle condizioni.

Reindirizza tutte le richieste a file e directory inesistenti alla home page:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . / [R=301]

Con quanto sopra:

  • %{REQUEST_FILENAME} - è la stringa da controllare. In questo caso, è il nome del file richiesto, che è una variabile di sistema disponibile per ogni richiesta.
  • -f - è una condizione incorporata che verifica se il nome richiesto esiste sul disco ed è un file. Il  ! è un operatore di negazione. Combinato, !-f restituisce true solo se un nome specificato non esiste o non è un file.
  • Allo stesso modo, !-d restituisce true solo se un nome specificato non esiste o non è una directory.

L'ultima riga  RewriteRule entrerà in vigore solo per le richieste a file o directory inesistenti. Lo stesso RewriteRule è molto semplice. Il punto . nel pattern corrisponde a qualsiasi cosa e la sostituzione indirizza ogni richiesta alla root / del sito web.

Inoltre, il flag [R=301]indica ad Apache di restituire un codice di risposta HTTP 301 Moved Permanently al browser, in modo che il browser sappia che il reindirizzamento è avvenuto e recupera esplicitamente la root del sito Web anziché l'URL richiesto, con la modifica riflessa sulla barra degli indirizzi del browser.

Senza questo flag, Apache restituirebbe i contenuti della root del sito Web, ma il browser continuerebbe a pensare che l'URL della pagina richiesta esiste e mostrerebbe l'indirizzo originariamente richiesto sulla barra degli indirizzi.

Conclusione

mod_rewrite ti consente di creare URL leggibili dagli utenti. In questo tutorial, hai utilizzato la direttiva RewriteRule per reindirizzare gli URL, inclusi quelli con Query Strings. Hai anche scritto il reindirizzamento condizionale degli URL utilizzando la direttiva RewriteCond.