¿Cómo omito el manejo 404 de wordpress y redirijo todos los errores 404 para archivos estáticos a 404.html?

17

¿Cómo omito el manejo 404 de wordpress y redirijo todos los errores 404 para archivos estáticos a 404.html?

¿Leí y parece que no es posible al usar enlaces permanentes?

El objetivo es reducir la carga del servidor para errores 404 al no cargar php.

pensador libre
fuente

Respuestas:

8

.htaccess omite el manejo de errores de WordPress 404 para archivos estáticos .

<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: Estas reglas fueron generadas por el plugin W3 Total Cache *

Nginx omite el manejo de WordPress 404 para archivos estáticos.

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;
}
Chris_O
fuente
1

Para ampliar lo que dijo Chris_O ... Instalaría W3 Total Cache y usaría la configuración de ese complemento para no almacenar en caché los archivos estáticos. El complemento en sí mismo es muy útil y imprescindible para acelerar su sitio, especialmente con la última actualización.

También le recomiendo que eche un vistazo a Creación de una página de error 404 desde Wordpress para ver cómo manejar 404 para archivos estáticos, 403 (prohibido), etc. Es una buena lectura.

Matthew Xerri
fuente
1

Quizás una solución simple. Use la etiqueta condicional is_404()y cree una redirección a su archivo estático; incluye el código en el archivo header.phpo index.phpdel tema.

Aquí un ejemplo.

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

Enlaces

bueltge
fuente
2
La toma de decisiones todavía se realiza en PHP aquí y no a nivel de acceso. El objetivo es omitir la carga de PHP por completo para errores 404.
librepensador
2
@freethinker: correcto, solo a través de php; el camino a través de htaccess es más rápido, pero tal vez no sea tan fácil de manejar en WordPress
bueltge
@kaiser oops, actualizó la pregunta
librepensador
0

No estoy seguro de que esto sea posible. Si observa el código htaccess que WordPress crea cuando habilita los enlaces permanentes, básicamente dice: "Si no se puede encontrar el archivo / directorio, envíelo a index.php". Esto incluye todas las solicitudes 404 reales. Además de crear una lista de todos los recursos públicos generados dinámicamente que WordPress conoce e insertarlos directamente en .htaccess, deberá cargar php para manejar los 404.

mfields
fuente
0

Me gustó la idea de Chris_O , pero hice mi propia versión, que es más segura.

Entonces, lo que hice fue agregar carpetas a la excepción, por lo que si sus solicitudes comienzan desde esas líneas, definitivamente no es un enlace permanente válido. La mayoría de las solicitudes provienen de bots que intentan verificar los contenidos de esas carpetas en busca de vulnerabilidades. Se filtrarán de manera efectiva y, si es necesario, puede mostrar una pequeña página 404 estática.

Wordpress seguirá manejando otras solicitudes, y si alguien ingresa una dirección incorrecta, mostrará un mensaje amigable no encontrado dentro de su plantilla. La solución de Chris_O solo funcionará para solicitudes que parecen extensiones de archivo, de lo contrario, también serán manejadas por WordPress.

Para hacerlo aún más confiable, puede recuperar su archivo de acceso sin procesar y buscar errores 404. Si observa muchas solicitudes que comienzan con líneas particulares, también puede incluirlas en este filtro:

#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>
Anónimo
fuente
0

Tengo múltiples CMS instalados en mi sitio, así que uso algo como esto para usar la misma página de error 404 para todos los CMS. Uso este conf para Nginx + FastCgi y funciona 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;
    }
}

Yo uso esta configuración junto con esto en php.ini:

cgi.fix_pathinfo = 1 

Wordpress se instala así http://example.com/wordpress/ . el 404.html se encuentra en la raíz de http://example.com/ .

PD No olvide que los servicios PHP y Nginx deben reiniciarse después de realizar cambios en los archivos php.ini o nginx.conf para que los cambios surtan efecto.

eliz82
fuente
-3

Hay 3 formas de hacer esto

  1. Al cambiar su código 404.php.
  2. Mediante el uso de complementos de WordPress.
  3. Al editar su archivo .htaccess.

Tutorial completo - (enlace muerto y redirigido a spam)

Mazhar
fuente
Hola Mazhar, ¿podrías publicar una respuesta completa, en lugar de solo un enlace a tu sitio? Si ese enlace muere, ¡esta respuesta será prácticamente inútil! ¡Salud!
Stephen Harris el
Esta página da un 404. Irónico. ¿O estás tratando de decir algo?
Michiel van der Blonk