web-dev-qa-db-fra.com

Comment rediriger uniquement si la page n'existe pas

J'ai récemment changé radicalement la structure de mon site et je reçois des erreurs de pages qui existaient dans le passé (et elles existeront probablement) dans le futur.

par exemple:

dans le passé, j'avais 44 pages (example.com/manual-cat/how-to/page/44/) et je n'ai pour l'instant que des articles à avoir 39 pages, mais j'aurai probablement plus de pages à l'avenir.

Comment puis-je rediriger temporairementSEULEMENTsi la page n'existe pas?

La raison pour laquelle je dois le faire automatiquement est que j'ai plus de 100 catégories avec des erreurs et qu'il serait impossible de gérer cela manuellement en faisant des redirections individuelles.

Si cela devait être fait côté serveur, sachez que je suis sur nginx.

2
Alex

Vous pouvez détecter des pages inexistantes uniquement avec WordPress. Les URL normales ne pointent pas sur une ressource physique, leur chemin est mappé en interne sur le contenu de la base de données.

Cela signifie que vous avez besoin d'un hook WP qui ne se déclenche que si aucun contenu n'a été trouvé pour une URL. Ce hook est 404_template. Ceci est appelé lorsque WP essaie d'inclure le modèle 404 de votre thème (ou le index.php s'il n'y a pas de 404.php).

Vous pouvez l'utiliser pour les redirections, car aucune sortie n'a été envoyée pour le moment.

Créez un plugin personnalisé et ajoutez-y vos règles de redirection.

Voici un exemple:

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

Vous n'êtes bien sûr pas limité à une simple carte. J'ai des versions de ce plugin assez complexes pour certains clients, et vous pouvez même créer une interface utilisateur pour créer cette carte dans le backend de l'administrateur… mais dans la plupart des cas, cette approche simple fera ce que vous voulez.

5
fuxia

Dans votre .htaccess, essayez:

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

Donc, s'il ne frappe pas un fichier ou un répertoire, il passera à la règle de réécriture en bas.

Pour nginx:

# nginx configuration
location / {
if (-e $request_filename){
rewrite ^/match/this/(.*)$ /somewhere/else/$1 break;
}
}
0
Jeff Mattson