Errore 403 Forbidden: cosa blocca l’accesso al tuo sito
· 6 min di lettura
Cosa significa l’errore
Un 403 non è un guasto: il server ha ricevuto la richiesta, l’ha capita e ha deciso di non servirla. Il browser mostra una pagina con “403 Forbidden”, “Accesso negato” o la pagina di errore del sito. Su un sito di altri il motivo è di solito una scelta del proprietario: contenuto riservato, paese o rete esclusi, VPN o IP bloccati, troppe richieste in poco tempo. Puoi solo riprovare da un’altra rete, senza VPN, dopo qualche minuto; se resta, è voluto.
Sul tuo sito il discorso cambia: un 403 improvviso, su tutte le pagine o su una cartella, nasce quasi sempre da un permesso sbagliato, da una riga in un .htaccess, da una regola di sicurezza che ha scambiato una richiesta normale per un attacco o da un firewall. Il resto della guida riguarda questo caso.
Cause frequenti sul proprio sito
- Permessi o proprietario dei file. Dopo un caricamento via SFTP, un backup ripristinato o un cambio di utente PHP, il server web non può leggere i file (per esempio
600invece di644, cartelle700invece di755, proprietario diverso dall’utente del server web). - Una riga in
.htaccess.Deny from all,Require all denied, un blocco di IP troppo largo o una regola copiata da un tutorial che chiude tutto. Vale anche per gli.htaccessnelle sottocartelle. - Nessun file indice. La cartella non contiene
index.htmloindex.phpeOptions -Indexesvieta di elencarla: Apache risponde 403 invece di una lista di file. - ModSecurity o il WAF. Una regola del firewall applicativo blocca una richiesta che contiene parole, caratteri o campi che le sembrano sospetti: il salvataggio di un articolo con un pezzo di codice, un modulo con un URL dentro, un upload.
- Firewall o blocco geografico. Il pannello del provider di hosting, un plugin di sicurezza o fail2ban hanno bloccato il tuo IP dopo qualche login sbagliato, oppure un intero paese.
- Regole di Cloudflare. Una regola WAF, un livello di sicurezza alto, un blocco di paese o un “challenge” che un bot (compreso un servizio di monitoraggio) non supera.
- Protezione hotlink. Le immagini rispondono 403 quando vengono chiamate da un altro dominio, a volte anche dal tuo, se la regola non include tutte le forme del dominio.
Se è il tuo sito: verificare prima
Apri il Website down checker: ti dice se il 403 arriva anche dalla nostra località di verifica in Europa oppure solo da te. Solo da te: è un blocco del tuo IP o della tua rete (causa 5 o 6). Da ovunque: continua con il log degli errori, che per un 403 dice quasi sempre il motivo esatto.
# Apache: il motivo del 403 è nel log degli errori
sudo tail -n 50 /var/log/apache2/error.log
# nginx
sudo tail -n 50 /var/log/nginx/error.log
# il file è leggibile dal server web?
ls -la /var/www/example.com/public/
namei -l /var/www/example.com/public/index.php
Come leggere il log: client denied by server configuration indica una direttiva di accesso in .htaccess o nel vhost; Permission denied o (13)Permission denied: access to / denied i permessi dei file; Directory index forbidden by Options directive la cartella senza file indice; ModSecurity: Access denied with code 403 con un id di regola il WAF; in nginx directory index of "/var/www/…" is forbidden oppure open() … failed (13: Permission denied).
Soluzioni
1. Rimettere a posto permessi e proprietario
Per un sito normale: file 644, cartelle 755, tutto di proprietà dell’utente con cui gira il server web o PHP (spesso www-data, oppure il tuo utente di hosting):
cd /var/www/example.com/public
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chown -R www-data:www-data .
Su un hosting condiviso, il pannello cliente ha di solito una funzione “ripristina permessi”. Mai 777: apre il sito a chiunque sulla stessa macchina.
2. Correggere l’.htaccess
Cerca le righe che negano l’accesso e commentale o restringile:
grep -rn -iE "deny from|require all denied|require ip|order allow" /var/www/example.com/public --include=.htaccess
Se non sai da dove viene una riga, rinomina il file in .htaccess.off, ricarica la pagina e, se il 403 sparisce, rimetti le righe una alla volta.
3. Aggiungere un file indice o permettere l’elenco
Se la cartella deve mostrare una pagina, aggiungi index.html o index.php, oppure indica il nome giusto con DirectoryIndex. Se invece deve elencare i file (una cartella di download), sostituisci Options -Indexes con Options +Indexes solo per quella cartella.
4. ModSecurity e WAF: escludere la regola, non spegnere tutto
Prendi l’id della regola dal log e disattivalo solo per il percorso che ne ha bisogno:
<LocationMatch "/wp-admin/post.php">
SecRuleRemoveById 941100
</LocationMatch>
Su un hosting condiviso la stessa cosa si fa dal pannello cliente (sezione ModSecurity o WAF), spesso per dominio. Spegnere il WAF per tutto il sito toglie una protezione utile: preferisci un’eccezione mirata.
5. Sbloccare l’IP, il paese o il bot
Controlla, in quest’ordine: il plugin di sicurezza di WordPress (IP bloccati, blocco paesi), fail2ban sul server (sudo fail2ban-client status, poi sudo fail2ban-client set nome-jail unbanip 203.0.113.5), il firewall del pannello del provider di hosting, e su Cloudflare le regole WAF e il livello di sicurezza. Se un servizio di monitoraggio deve continuare a controllare il sito, metti il suo user agent o i suoi IP tra le eccezioni invece di abbassare la protezione per tutti.
6. Protezione hotlink
La regola deve consentire tutte le forme del tuo dominio e le richieste senza Referer:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]
Se il problema è presso il tuo provider di hosting
Se il log non è accessibile e i permessi e l’.htaccess sono a posto, il blocco è nel pannello, nel WAF o nel firewall del provider. Invia questo messaggio:
Buongiorno, da circa le 10:00 (UTC) il mio sito example.com risponde “403 Forbidden” su tutte le pagine, anche da reti diverse. Permessi dei file (644/755) e .htaccess sono corretti e da parte mia non ho modificato nulla. Potete verificare se una regola di ModSecurity, del firewall o del blocco geografico sul vostro lato sta bloccando il mio dominio, e indicarmi la regola nel log?
Perché non succeda di nuovo
Un 403 improvviso segue quasi sempre un’azione: un ripristino, un aggiornamento di un plugin di sicurezza, una regola nuova. Un controllo HTTP dall’esterno lo nota al primo giro, perché un codice 403 non è un 200, e ti avvisa prima dei visitatori. Per un sito WordPress, l’assistenza WordPress su richiesta tiene d’occhio aggiornamenti, plugin e avvisi di sicurezza, senza contratto. Il sito risponde invece con un errore del server e non con un rifiuto? Leggi la guida all’errore 500 Internal Server Error.
Down? Interveniamo. Sul tuo server o su un hosting condiviso con accesso SSH, il Quick Fix corregge i piccoli errori di configurazione come permessi sbagliati o una riga di troppo nell’.htaccess, con copia di backup prima, a prezzo fisso, 24 ore su 24, anche nel fine settimana; il Deep Fix si occupa di WAF, firewall e regole dell’applicazione, a blocchi di 15 minuti; la stima è il prezzo massimo.
E adesso
Verifica dall’esterno
Il sito è down per tutti o solo per te, e cosa risponde il server? Gratis, senza registrazione.
Website down checkerDown? Interveniamo.
Sul tuo server o su un hosting condiviso con accesso SSH: Quick Fix a prezzo fisso per le cause più comuni, Deep Fix fatturato a blocchi di 15 minuti per tutto il resto, 24/7. Prezzo visibile prima dell’ordine.
Ordina un interventoAltre guide
- Sito non raggiungibile: cosa fare nei primi 15 minuti
- Server down o non raggiungibile: cosa controllare e in che ordine
- Errore 500 Internal Server Error: trovare la causa nei log e rimettere online il sito
- Errore 502 Bad Gateway: trovare la causa e risolverlo
- Errore 503: sovraccarico, manutenzione o limite dell’hosting?
- Errore 504 Gateway Timeout: trovare cosa rallenta
- Errore 521 e 522 di Cloudflare: il server di origine non risponde
- DNS_PROBE_FINISHED_NXDOMAIN: il dominio non risponde più
- ERR_CONNECTION_REFUSED: il server rifiuta la connessione
- ERR_CONNECTION_TIMED_OUT: il server non risponde in tempo
- Cosa significa “La connessione non è privata” e come risolverlo
- ERR_SSL_PROTOCOL_ERROR: la connessione sicura fallisce prima del certificato
- ERR_TOO_MANY_REDIRECTS: trovare il ciclo di reindirizzamenti e chiuderlo