wake-up-neo.net

So leiten Sie nur um, wenn die Seite nicht vorhanden ist

Ich habe kürzlich die Struktur meiner Website dramatisch verändert und ich erhalte Fehler von Seiten, die in der Vergangenheit existierten (und wahrscheinlich auch in der Zukunft wieder existieren werden).

z.B:

in der vergangenheit hatte ich 44 seiten (example.com/manual-cat/how-to/page/44/) und im moment habe ich nur beiträge um 39 pages zu haben, aber ich werde wahrscheinlich in zukunft mehr seiten haben.

Wie kann ich vorübergehendNURumleiten, wenn die Seite nicht existiert?

Der Grund, warum ich dies automatisch tun muss, ist, dass ich mehr als 100 Kategorien mit Fehlern habe und es unmöglich wäre, dies manuell zu verwalten, indem ich einzelne Weiterleitungen vornehme.

Wenn dies auf dem Server erfolgen musste, beachten Sie bitte, dass ich auf Nginx bin.

2
Alex

Sie können nicht vorhandene Seiten nur mit WordPress erkennen. Normale URLs verweisen nicht auf eine physische Ressource, sondern ihr Pfad wird intern dem Datenbankinhalt zugeordnet.

Das bedeutet, dass Sie einen WP -Hook benötigen, der nur ausgelöst wird, wenn für eine URL kein Inhalt gefunden wurde. Dieser Haken ist 404_template. Dies wird aufgerufen, wenn WP versucht, die 404-Vorlage aus Ihrem Design einzuschließen (oder den index.php, wenn es keinen 404.php gibt).

Sie können es für Weiterleitungen verwenden, da zu diesem Zeitpunkt noch keine Ausgabe gesendet wurde.

Erstellen Sie ein benutzerdefiniertes Plugin und fügen Sie darin Ihre Umleitungsregeln hinzu.

Hier ist ein Beispiel:

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

Sie sind natürlich nicht auf eine einfache Karte beschränkt. Ich habe Versionen dieses Plugins, die für einige Clients sehr komplex sind, und Sie können sogar eine Benutzeroberfläche erstellen, um diese Map im Admin-Backend zu erstellen. In den meisten Fällen wird dieser einfache Ansatz jedoch das tun, was Sie wollen.

5
fuxia

Versuchen Sie in Ihrem .htaccess:

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

Wenn also keine Datei oder kein Verzeichnis gefunden wird, wird die Umschreiberegel unten angezeigt.

Für Nginx:

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