Cómo redirigir solo si la página no existe

2

Recientemente cambié dramáticamente la estructura de mi sitio y recibo errores de las páginas que existían en el pasado (y probablemente existirán) en el futuro nuevamente.

por ejemplo:

en el pasado tenía 44 páginas ( example.com/manual-cat/how-to/page/44/ ) y en este momento solo tengo publicaciones que tengan 39 pages , pero probablemente tendré más páginas en el futuro.

¿Cómo puedo redireccionar temporalmente SOLAMENTE si la página no existe?

La razón por la que necesito hacer esto automáticamente es que tengo más de 100 categorías con errores y sería imposible administrar esto manualmente haciendo redirecciones individuales.

Si esto tenía que hacerse en el lado del servidor, ten en cuenta que estoy en nginx.

    
pregunta Alex 17.04.2017 - 01:07

3 respuestas

5

Puede detectar páginas no existentes solo con WordPress. Las URL normales no apuntan a un recurso físico, su ruta se asigna internamente al contenido de la base de datos.

Eso significa que necesita un gancho WP que se active solo cuando no se haya encontrado contenido para una URL. Ese gancho es 404_template . Esto se llama cuando WP intenta incluir la plantilla 404 de su tema (o el index.php si no hay 404.php ).

Puede usarlo para redireccionamientos, porque no se ha enviado ningún resultado en este momento.

Cree un complemento personalizado y agregue sus reglas de redirección en eso.

Aquí hay un ejemplo:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Custom Redirects
 */

add_filter( '404_template', function( $template ) {

    $request = filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING );

    if ( ! $request ) {
        return $template;
    }

    $static = [
        '/old/path/1/' => 'new/path/1/',
        '/old/path/2/' => 'new/path/2/',
        '/old/path/3/' => 'new/path/3/',
    ];

    if ( isset ( $static[ $request ] ) ) {
        wp_redirect( $static[ $request ], 301 );
        exit;
    }

    $regex = [
        '/pattern/1/(\d+)/'    => '/target/1/$1/',
        '/pattern/2/([a-z]+)/' => '/target/2/$1/',
    ];

    foreach( $regex as $pattern => $replacement ) {
        if ( ! preg_match( $pattern, $request ) ) {
            continue;
        }

        $url = preg_replace( $pattern, $replacement, $request );
        wp_redirect( $url, 301 );
        exit;
    }

    // not our business, let WP do the rest.
    return $template;

}, -4000 ); // hook in quite early

Por supuesto, no está limitado a un mapa simple. Tengo versiones de ese complemento con bastante complejo para algunos clientes, e incluso podría crear una interfaz de usuario para crear ese mapa en el backend del administrador ... pero en la mayoría de los casos, este enfoque simple hará lo que quiera.

    
respondido por el fuxia 17.04.2017 - 02:20
0

En su .htaccess intente:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]

RewriteRule ^match/this/(.*)$ somewhere/else/$1 [L]
</IfModule>

Entonces, si no golpea un archivo o un directorio, irá a la regla de reescritura en la parte inferior.

Para nginx:

# nginx configuration
location / {
if (-e $request_filename){
rewrite ^/match/this/(.*)$ /somewhere/else/$1 break;
}
}
    
respondido por el Jeff Mattson 17.04.2017 - 01:52
-1

Puedes usar y editar el archivo .htaccess

# Redirect old file path to new file path
Redirect /manual-cat/how-to/page/44/ http://example.com/newdirectory/newfile.html
    
respondido por el Max 17.04.2017 - 01:21

Lea otras preguntas en las etiquetas