web-dev-qa-db-ja.com

ページが存在しない場合にのみリダイレクトする方法

私は最近私のサイトの構造を劇的に変えました、そして私は過去に存在していたページからのエラーを得ています(そしてそれらは将来また存在するでしょう)。

例えば:

過去に私は44ページ(example.com/manual-cat/how-to/page/44/)を持っていました、そして今現在私は39 pagesを持っているべき記事だけを持っています、しかし私は将来もっと多くのページを持つでしょう。

ページが存在しない場合、どうすれば一時的に _ only _ にリダイレクトできますか?

これを自動的に行う必要があるのは、100以上のカテゴリにエラーがあり、個々のリダイレクトを行ってこれを手動で管理することは不可能だからです。

これをサーバー側で行わなければならない場合は、nginxを使っていることに注意してください。

2
Alex

存在しないページはWordPressでしか検出できません。通常のURLは物理的なリソースを指しているのではなく、そのパスはデータベースのコンテンツに内部的にマッピングされています。

つまり、URLのコンテンツが見つからない場合にのみ起動するWPフックが必要です。そのフックは404_templateです。これはWPがテーマから404テンプレートをインクルードしようとしたときに呼び出されます(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を構築することさえできます….

5
fuxia

あなたの.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;
}
}
0
Jeff Mattson