如何仅在页面不存在时重定向

时间:2017-04-16 作者:bpy

我最近戏剧性地改变了我的网站的结构,我从过去存在的页面中得到了错误(它们很可能会再次存在)。

例如:

过去我有44页(example.com/manual-cat/how-to/page/44/) 现在我只有帖子39 pages, 但我将来可能会有更多的页面。

如何临时重定向ONLY 如果页面不存在?

我需要自动执行此操作的原因是,我有100多个类别存在错误,并且不可能通过执行单个重定向来手动管理。

如果必须在服务器端执行此操作,请注意我使用的是nginx。

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

您只能使用WordPress检测不存在的页面。普通URL不指向物理资源,它们的路径在内部映射到数据库内容。

这意味着您需要一个WP挂钩,该挂钩仅在找不到URL的内容时触发。那个钩子是404_template. 当WP尝试从您的主题(或index.php 如果没有404.php).

您可以将其用于重定向,因为此时尚未发送任何输出。

创建一个自定义插件,并在其中添加重定向规则。

以下是一个示例:

<?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
你当然不局限于一张简单的地图。我有一些版本的插件,对于某些客户端来说非常复杂,你甚至可以构建一个UI来在管理后端创建地图……但在大多数情况下,这种简单的方法可以满足你的需要。

SO网友:Jeff Mattson

在您的中。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>
因此,如果它没有命中文件或目录,它将转到底部的重写规则。

对于nginx:

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

SO网友:Max

您可以使用和编辑。htaccess文件

# Redirect old file path to new file path
Redirect /manual-cat/how-to/page/44/ http://example.com/newdirectory/newfile.html

相关推荐

Redirection problems

请帮助我克服重定向问题。我需要在子域上工作,而不是在主域上工作,但这里两个域是不同的。我所做的是-将所有(website.com)文件复制到另一个子域(demo.websiteA.com),并根据wp配置更改数据库名称。php文件。但每当我尝试打开演示时。网站a。com它重定向到网站。com公司请帮帮我提前感谢