Come evitare la gestione 404 di WordPress e reindirizzare tutti gli errori 404 dei file statici a 404.html?
Come posso evitare la gestione 404 di WordPress e reindirizzare tutti gli errori 404 dei file statici a 404.html?
Ho letto che sembra non sia possibile quando si utilizzano i permalink?
L'obiettivo è ridurre il carico del server per gli errori 404 evitando di caricare PHP.

.htaccess per saltare la gestione degli errori 404 di WordPress per file statici.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ [NC]
RewriteRule .* - [L]
</IfModule>
Nota: Queste regole sono state generate dal plugin W3 Total Cache*
Nginx per saltare la gestione degli errori 404 di WordPress per file statici.
if (-f $request_filename) {
break;
}
if (-d $request_filename) {
break;
}
if ($request_uri ~ "(robots\.txt|sitemap\.xml(\.gz)?)") {
break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
return 404;
}

Forse una soluzione semplice. Usa il tag condizionale is_404()
e crea un reindirizzamento al tuo file statico; includi il codice nel file header.php
o index.php
del tema.
Ecco un esempio.
if ( is_404() ) {
wp_redirect( 'static.htm' );
exit;
}
Link

la decisione viene ancora presa in PHP qui e non a livello di htaccess. L'obiettivo è saltare del tutto il caricamento di PHP per gli errori 404.

@freethinker: giusto, solo tramite php; la via tramite htaccess è più veloce, ma forse non così semplice da gestire in WordPress

Per ampliare quanto detto da Chris_O... consiglierei di installare W3 Total Cache e utilizzare le impostazioni di questo plugin per non memorizzare nella cache i file statici. Il plugin in sé è molto utile e indispensabile per velocizzare il tuo sito, soprattutto con l'ultimo aggiornamento.
Inoltre, ti consiglio di dare un'occhiata alla pagina Creazione di una Pagina di Errore 404 su WordPress per vedere come gestire gli errori 404 per i file statici, 403 (accesso negato), ecc. È una lettura interessante.

Non sono sicuro che questo sia possibile. Se osservi il codice htaccess che WordPress genera quando abiliti i permalink, sostanzialmente dice: "Se il file/directory non viene trovato, invialo a index.php". Questo include tutte le vere richieste 404. A meno di creare una lista di ogni risorsa pubblica generata dinamicamente che WordPress conosce e inserirla direttamente in .htaccess, dovrai caricare php per gestire gli errori 404.

Mi è piaciuta l'idea di Chris_O, ma ho creato la mia versione, che è più sicura.
Quello che ho fatto è stato aggiungere cartelle alle eccezioni, quindi se la tua richiesta inizia con quelle righe - non è sicuramente un permalink valido. La maggior parte delle richieste proviene da bot che cercano di verificare il contenuto di quelle cartelle alla ricerca di exploit. Verranno efficacemente filtrate e, se necessario, puoi mostrare una piccola pagina statica 404.
Le altre richieste saranno comunque gestite da WordPress, e se qualcuno inserisce un indirizzo sbagliato verrà visualizzato un messaggio di "non trovato" user-friendly all'interno del tuo template. La soluzione di Chris_O funziona solo per le richieste che sembrano estensioni di file, altrimenti verranno comunque gestite da WordPress.
Per renderlo ancora più affidabile, puoi recuperare il tuo file di accesso grezzo e cercare gli errori 404. Se noti molte richieste che iniziano con righe particolari, puoi includerle anche in questo filtro:
#aggiunta del tuo gestore personalizzato
ErrorDocument 404 /404/index.html
<IfModule mod_rewrite.c>
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/(404|cgi-bin|wp-admin|wp-content|wp-includes)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Ho più CMS installati sul mio sito, quindi utilizzo qualcosa di simile per usare la stessa pagina di errore 404 per tutti i CMS. Uso questa configurazione per Nginx+FastCgi e funziona correttamente:
server {
...
error_page 404 /404.html; #abilita la pagina personalizzata per l'errore 404
location ~ /\.ht {
deny all; #disabilita l'accesso agli htaccess
}
location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_intercept_errors on; #disabilita l'intercettazione degli errori 404 di PHP
}
location /wordpress/ {
try_files $uri $uri/ /wordpress/index.php?$args;
}
}
Utilizzo questa configurazione insieme a questa in php.ini:
cgi.fix_pathinfo = 1
WordPress è installato in questo modo http://example.com/wordpress/. Il file 404.html si trova nella root di http://example.com/.
P.S. Non dimenticare che i servizi PHP e Nginx devono essere riavviati dopo aver apportato modifiche ai file php.ini o nginx.conf affinché le modifiche abbiano effetto.

Ciao Mazhar, potresti pubblicare una risposta completa, invece di solo un link al tuo sito. Se quel link muore, questa risposta sarà praticamente inutile! Grazie!
