Spiegazione del file .htaccess
Incolla il file e ogni riga riceve una frase che dice cosa fa. I pattern di rewrite vengono smontati pezzo per pezzo, e le regole che corrispondono a schemi di infezione noti vengono segnate per un controllo più attento.
Una configurazione che vive nella cartella
Un server web ha un file di configurazione principale che solo il suo amministratore può modificare. Su un hosting condiviso quell’amministratore non sei tu, quindi Apache ti offre un’altra porta d’ingresso. È un semplice file di testo chiamato .htaccess, messo in una cartella del sito, e le sue istruzioni valgono per quella cartella e per tutto quello che c’è sotto. I server LiteSpeed leggono lo stesso file. nginx no, e lo ignora del tutto.
Il server rilegge il file a ogni richiesta, quindi una modifica ha effetto nel momento in cui salvi. Anche un errore. Basta una direttiva scritta male e ogni pagina risponde con un errore 500 finché non correggi la riga. Tieni una copia prima di ogni modifica.
Raramente sei l’unico autore. WordPress scrive un blocco tra # BEGIN WordPress e # END WordPress, e i plugin di cache, sicurezza e immagini aggiungono i propri blocchi marcati. Lo strumento riconosce i marcatori di circa 25 di loro, tra cui WP Rocket, LiteSpeed Cache, Wordfence e Really Simple SSL, e indica il proprietario di ogni blocco.
Leggere ad alta voce una regola di rewrite
mod_rewrite è dove la maggior parte delle persone si perde. Prendi questa coppia:
RewriteCond %{HTTP_HOST} ^shop\.example\.com$ [NC]
RewriteRule ^products/(\d+)$ https://www.example.com/item?id=$1 [R=301,L]Si legge come una frase: «Se l’host richiesto è shop.example.com, in maiuscolo o minuscolo, e il percorso è products/ seguito da cifre, manda il visitatore in modo permanente al nuovo indirizzo con quelle cifre come id, e smetti di elaborare.»
- Un
RewriteCondè una condizione su una variabile del server. Vale solo per laRewriteRulesuccessiva. Se ce ne sono diverse di fila devono essere tutte vere, a meno che una finisca con[OR]. - La prima parte di una
RewriteRuleè un’espressione regolare confrontata con il percorso. Le parentesi catturano del testo, e$1,$2lo riusano nella destinazione.%1riusa una cattura dell’ultima condizione.
| Flag | Effetto |
|---|---|
L | Ultima regola di questo passaggio. END si ferma definitivamente. |
R=301 | Risponde con un reindirizzamento. 301 è permanente, 302 temporaneo. Senza R la riscrittura è interna e la barra degli indirizzi del visitatore non cambia. |
NC | Ignora maiuscole e minuscole. |
QSA | Conserva la query string originale e la aggiunge. |
F, G | Rifiuta con 403, o risponde 410 Gone. |
P | Proxy: prende il contenuto da un altro server e lo serve come se fosse tuo. |
Cosa viene segnalato
Chi attacca un sito e ottiene accesso in scrittura punta spesso al .htaccess, perché poche righe lì bastano per reindirizzare i visitatori o tenere raggiungibile uno script nascosto. Lo strumento confronta ogni riga con schemi visti in infezioni reali e le assegna una di due etichette.
Sospetta, in rosso:
- un reindirizzamento verso un altro dominio che vale solo per i visitatori che arrivano da un motore di ricerca, o solo per i telefoni. Il proprietario, che digita l’indirizzo direttamente da un computer, non lo vede mai;
- uno script PHP diverso servito ai crawler dei motori di ricerca;
AddHandler,AddTypeoSetHandlerche fanno eseguire come PHP file di immagini o di testo, o fanno eseguire file normali come script CGI;php_value auto_prepend_fileoauto_append_fileche caricano un file prima o dopo ogni script, eallow_url_include;- un blocco
FilesMatchche nega ogni file.php,.pyed.exe, seguito da un blocco che autorizza un breve elenco di file PHP che WordPress non include.
Da controllare, in arancione: righe dentro il blocco WordPress che non fanno parte delle sue regole standard, condizioni rivolte solo ai crawler o ai referrer, il flag [P], una pagina di errore ospitata su un altro dominio, l’elenco delle cartelle attivato, errori PHP mostrati ai visitatori, un firewall applicativo disattivato, righe più lunghe di 400 caratteri o piene di base64 o di caratteri codificati, e caratteri invisibili.
Vengono segnalati anche due errori di struttura, perché entrambi causano un 500: un blocco come <IfModule> che non viene mai chiuso, e direttive ammesse solo nella configurazione principale del server, come DocumentRoot o <VirtualHost>.
Lo strumento legge del testo. Non esegue le regole, non può sapere quali moduli ha caricato il tuo server e non vede gli altri file .htaccess nelle cartelle superiori né la configurazione principale, che cambiano tutti il risultato. Una segnalazione significa «scopri chi l’ha aggiunta», e ogni tanto anche plugin legittimi ne fanno scattare una. Un file senza segnalazioni non prova che il sito sia pulito.
Se una riga è segnalata e non l’hai scritta tu
- Scarica una copia del file come prova prima di toccare qualsiasi cosa.
- Controlla la data di modifica del file e cerca altri file modificati nello stesso momento, soprattutto file PHP nelle cartelle di upload e i nomi citati nelle regole segnalate.
- Elimina le righe ostili, poi ricarica il file qualche minuto dopo. Se sono tornate, uno script sul server lo sta riscrivendo e cancellare le righe non basterà.
- Cambia le password dell’hosting, dell’FTP o SSH, del database e dell’amministratore del CMS, e aggiorna il CMS con tutti i suoi plugin e temi.
- Usa la verifica dei siti pericolosi per vedere se il sito è già in una lista nera dei browser, e il tracciamento dei reindirizzamenti per confermare che i visitatori arrivano dove devono.
Domande frequenti
Dove si trova il file .htaccess?
Nella cartella principale del sito, spesso chiamata public_html, httpdocs o www. Le sottocartelle possono averne uno proprio. I nomi che iniziano con un punto sono nascosti per impostazione predefinita, quindi attiva «mostra file nascosti» nel file manager del tuo hosting o nel programma FTP.
Perché il mio sito mostra un errore 500 dopo che ho modificato il .htaccess?
Apache si ferma alla prima riga che non riesce a interpretare. Di solito è un errore di battitura nel nome di una direttiva, un blocco aperto e mai chiuso, una direttiva che il tuo hosting non permette nel .htaccess, o un modulo non installato. Ripristina la tua copia, poi rimetti le modifiche una alla volta.
Cosa significa [L,R=301] in una RewriteRule?
R=301 dice al browser di andare al nuovo indirizzo e di ricordarlo come permanente. L impedisce al server di applicare altre regole di rewrite a questa richiesta. Insieme formano il classico reindirizzamento permanente.
Come capisco se il mio file .htaccess è stato hackerato?
Cerca regole che non hai aggiunto tu: reindirizzamenti verso domini sconosciuti, condizioni su HTTP_REFERER o HTTP_USER_AGENT, handler che eseguono le immagini come PHP, e auto_prepend_file. Confronta il blocco WordPress con quello predefinito. Questa pagina segnala questi schemi al posto tuo.
Il .htaccess funziona su nginx?
No. nginx non ha file di configurazione per cartella. Chi amministra il server deve tradurre le regole nella sua configurazione. Alcuni hosting mettono nginx davanti ad Apache, e in quel caso il .htaccess vale ancora per le richieste che arrivano ad Apache.
Il file che incollo viene inviato al vostro server?
No. L’analisi è uno script che gira nel tuo browser. Anche così, prendi l’abitudine di togliere password e chiavi segrete da tutto quello che incolli in una pagina web.