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 root@IP_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 nome_utente@IP_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 nome_utente@IP_DEL_SERVER -p PORTA
Prerequisiti
Per seguire questo tutorial, avrai bisogno di:
- Un server Ubuntu 20.04 LTS Focal Fossa configurato seguendo la guida alla configurazione del server iniziale di Ubuntu 20.04, incluso un utente sudo non root e un firewall.
- Apache installato seguendo il passaggio 1 di Come installare Linux, Apache, MySQL, stack PHP (LAMP) su Ubuntu 20.04.
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:
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:
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:
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:
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 dopoyour_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 dopoabout
, poiché il carattere$
appare dopoabout
.http://your_server_ip/contact
, perché non corrisponderà alla stringaabout
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 direttivaRewriteCond
.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
.