web-dev-qa-db-fra.com

Comment ignorer la gestion 404 de wordpress et rediriger toutes les erreurs 404 des fichiers statiques vers 404.html?

Comment ignorer la gestion 404 de wordpress et rediriger toutes les erreurs 404 des fichiers statiques vers 404.html?

Je lis et il semble que ce n'est pas possible lorsque vous utilisez des permaliens?

L'objectif est de réduire la charge du serveur pour les erreurs 404 en ne chargeant pas php.

16
freethinker

.htaccess ignore la gestion des erreurs WordPress 404 pour fichiers statiques .

<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>

Remarque: Ces règles ont été générées par le plugin W3 Total Cache *

Nginx ignore la gestion de WordPress 404 pour les fichiers statiques.

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;
}
8
Chris_O

Peut-être une solution simple. Utilisez la balise conditionnelle is_404() et créez une redirection vers votre fichier statique. inclure le code dans le fichier header.php ou index.php du thème.

Voici un exemple.

   if ( is_404() ) {
      wp_redirect( 'static.htm' );
      exit;
   }

Liens

1
bueltge

Pour prolonger ce que Chris_O a dit…. J'installerais W3 Total Cache et utiliserais les paramètres de ce plugin pour ne pas mettre en cache les fichiers statiques. Le plugin en lui-même est très utile et indispensable pour accélérer votre site, en particulier avec la dernière mise à jour.

Je vous recommande également de consulter Création d'une page d'erreur 404 à partir de Wordpress pour savoir comment gérer 404 les fichiers statiques, 403 (interdit), etc. C'est une bonne lecture.

1
Matthew Xerri

Je ne suis pas sûr que ce soit possible. Si vous examinez le code htaccess créé par WordPress lorsque vous activez les liens permanents, il indique essentiellement: "Si le fichier/répertoire est introuvable, envoyez-le à index.php." Cela inclut toutes les demandes 404 réelles. En plus de créer une liste de toutes les ressources publiques générées dynamiquement dont WordPress a connaissance et de l'insérer directement dans .htaccess, vous devez charger php pour gérer les fichiers 404.

0
mfields

J'ai plusieurs CMS installés sur mon site, j'utilise quelque chose comme ceci pour utiliser la même page d'erreur 404 pour tous les CMS. J'utilise cette conf pour Nginx + FastCgi et ça fonctionne très bien:

server {
    ...
    error_page 404 /404.html; #enable custom 404 error page
    location ~ /\.ht {
        deny all; #disable access to 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; #disable PHP 404 error intercept
    }
    location /wordpress/ {
        try_files $uri $uri/ /wordpress/index.php?$args;
    }
}

J'utilise cette configuration avec ceci dans php.ini:

cgi.fix_pathinfo = 1 

wordpress est installé comme ceci http://example.com/wordpress/ . le 404.html est situé à la racine du http://example.com/ .

P.S. N'oubliez pas que PHP et les services Nginx doivent être redémarrés après la modification des fichiers php.ini ou nginx.conf pour que les modifications prennent effet.

0
eliz82

J'ai aimé l'idée de Chris_O , mais j'ai créé ma propre version, qui est plus sûre.

Donc, ce que j'ai fait, j'ai simplement ajouté des dossiers à une exception, donc si vos demandes commencent à partir de ces lignes, ce n'est certainement pas un permalien valide. La majorité des requêtes proviennent de bots qui essaient de vérifier le contenu de ces dossiers pour détecter des exploits. Elles seront effectivement filtrées et si nécessaire, vous pourrez afficher des petites pages statiques 404.

Les autres demandes seront toujours traitées par wordpress et si quelqu'un entre une mauvaise adresse, il affichera un message convivial non trouvé dans votre modèle. La solution de Chris_O ne fonctionnera que pour les demandes qui ressemblent à des extensions de fichier, sinon elles seront également traitées par wordpress.

Pour le rendre encore plus fiable, vous pouvez récupérer votre fichier d’accès brut et rechercher des erreurs 404. Si vous remarquez de nombreuses demandes commençant par des lignes particulières, vous pouvez également les inclure dans ce filtre:

#adding your own handler
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>
0
Anonymous