• 解決済 alitomo

    (@airarimichi)


    先日クライアントのサイトをリニューアルしました。
    その際旧サイトは同じドメイン配下にhp_archiveフォルダーを作って残す事になりました。
    以前のサイトの各ページのURLがSNSなどで存在しているので、新サイトで404になった場合はhp_archiveへリダイレクトするように404.phpに記載して運用しています。
    新サイトのパーマリンク構造はカスタム構造にしています。 Domein/news/%postname%/

    上記状態で固定ページ類の旧サイトのリンクは問題なく404.phpによりhp_archiveフォルダーに誘導出来るのですが、投稿類の旧サイトのリンクが誘導されず、Domein/news/とアーカイブのトップページで止まってしまいます。Query Monitorプラグインで確認したところ、301エラーになっているようでした。

    どの様にしたら、投稿の旧リンクをhp_archiveフォルダーに誘導出来ますでしょうか?
    ご享受頂けますと幸いです。どうぞよろしくお願いします。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • モデレーター まーちゅう

    (@rocketmartue)

    こんにちは。

    新サイトで404になった場合はhp_archiveへリダイレクトするように404.phpに記載して運用しています。

    とのことですが、具体的にどのようなコードを書かれているのかや hp_archive のサイト構造、パーマリンクの設定、投稿の旧リンクのURL構造、旧サイトの投稿数等も共有された方が回答が付きやすいと思います。

    情報が少ないので、なんとも言えませんが、404.phpではなく.htaccess でリダイレクトをかけた方が確実のような気がします。

    トピック投稿者 alitomo

    (@airarimichi)

    @rocketmartue さんありがとうございます。
    実は.htaccessでのリダイレクトも詳しい方に聞いて実行してみたんですが、うまくいきませんでした。
    404.phpは

    <?php
    $url = "Location:https://*****/hp_archive" . $_SERVER['REQUEST_URI'];
    header($url);
    exit();

    となっています。

    問題は投稿のアーカイブページにて存在しない投稿のリンクは404にならず、投稿のトップページに戻ってしまう事だと思いますので、パーマリンクのコアプログラムに詳しいかたにその辺りをお伺いしたいと思っています。

    モデレーター まーちゅう

    (@rocketmartue)

    .htaccessでのリダイレクトも詳しい方に聞いて実行してみたんですが、うまくいきませんでした。

    1. 具体的に何がどのように上手くいきませんでしたか?
    2. どのようなコードを書かれましたか?
    3. 投稿類の旧サイトのリンクが誘導されないということですが、具体的にどのようなリンクですか?
    4. 旧サイトの投稿数は、何記事ありますか?
    トピック投稿者 alitomo

    (@airarimichi)

    @rocketmartue

    >1. 具体的に何がどのように上手くいきませんでしたか?
    お伝えしている通り古い投稿のリンクの場合、ニュースのトップページ(アーカイブトップ)が表示される。
    ※存在しないリンクなのだから404にならないと駄目なのに、301になってアーカイブトップが表示される。

    >どのようなコードを書かれましたか?

    お待たせしすいません(bow)原因考えてみました。
    ニュースの場合、存在しないニュースの場合に404ステータスではなく、
    下に貼ったように301リダイレクトになっていることが原因ですね。
    .htaccess のルールを優先させ書くとしたら以下のようになりそうです。

    ーーーー新サイト側htaccess抜粋ーーーー
    RewriteEngine On 実在するファイル・ディレクトリの場合は何もせずPHPに渡す

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L] 存在しない場合はリダイレクト

    RewriteRule ^(.*)$ /hp_archive/$1 [L,R=301]
    ーーーー新サイト側htaccess抜粋ーーーー

    ファイル・ディレクトリが存在する場合:
    PHPのルーティング処理にリクエストが渡されます。
    存在しない場合:
    Apacheのリダイレクトルールが適用されます。

    レスポンス
    HTTP/2 301 Moved Permanently
    Server: nginx
    Date: Sat, 11 Jan 2025 09:29:31 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Location: https://********.jp/news/
    Expires: Wed, 11 Jan 1984 05:00:00 GMT
    Cache-Control: no-cache, must-revalidate, max-age=0
    X-Redirect-By: WordPress

    >投稿類の旧サイトのリンクが誘導されないということですが、具体的にどのようなリンクですか?
    https://*******.jp/news/12323/ を https://*******.jp/hp_archive/news/12323/ へリダイレクトしたいが実際は https://*******.jp/news/ が表示される。

    >旧サイトの投稿数は、何記事ありますか?
    800くらいあります。

    • この返信は1週、 3日前にalitomoが編集しました。
    トピック投稿者 alitomo

    (@airarimichi)

    もしかしたら、新サイトの投稿のパーマリンクは
    ドメイン/news/%postname%/
    と文字列になっているんですが、
    旧サイトのパーマリンクは数値になっているので、
    ドメイン/news/12345/ 
    その辺りが関係しているのかもしれません。

    モデレーター まーちゅう

    (@rocketmartue)

    問題点の整理

    • WordPressのcanonicalリダイレクト
      WordPressは存在しないシングル投稿のURLにアクセスがあった場合、正規のURLへ誘導するために自動的にリダイレクトを実施します。今回のケースでは、X-Redirect-By: WordPress というレスポンスヘッダーからも確認できるように、リクエストされた https://domein.jp/news/12323//news/ へリダイレクトされています。
    • 404.phpが実行されない
      canonicalリダイレクトが先に動作するため、404エラーにならず、404.phpの処理に到達していません。
    モデレーター まーちゅう

    (@rocketmartue)

    上の推察が正しければ、WordPress の canonical リダイレクト機能を、条件付きで無効化する必要があります。

    具体的には、存在しない投稿URL(今回の場合、シングル投稿ページ)にアクセスがあったときに、canonical リダイレクトをキャンセルするコードを追加します。

    function disable_canonical_for_nonexistent_posts( $redirect_url ) {
    // シングル投稿ページで、投稿が存在しない場合
    if ( is_singular('post') && ! have_posts() ) {
    return false; // canonicalリダイレクトをキャンセル
    }
    return $redirect_url;
    }
    add_filter( 'redirect_canonical', 'disable_canonical_for_nonexistent_posts' );

    自作テーマの場合は、テーマの functions.php に追加。
    それ以外の場合は、Code snippet 等のプラグインを利用してください。

    これでうまくいくかどうか試してみてください。

    モデレーター まーちゅう

    (@rocketmartue)

    .htaccess でのリダイレクトも考えてみました。

    固定ページ等は問題無いということなので /news/ 以下のパスで旧投稿URLを hp_archive/news/ 以下へリダイレクトさせます。
    https://domain.jp/news/12323/https://domain.jp/hp_archive/news/12323/ に301リダイレクト)

    RewriteEngine On

    # /news/以下のリクエストで、実在するファイル・ディレクトリでなければリダイレクト
    RewriteCond %{REQUEST_URI} ^/news/(.+)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^news/(.+)$ /hp_archive/news/$1 [R=301,L]

    コードの説明

    RewriteCond %{REQUEST_URI} ^/news/(.+)$
    リクエストURIが「/news/」で始まるかをチェックします。
    旧投稿リンクがこのパターンに当てはまる場合にリダイレクトルールが適用されます。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    既存のファイルやディレクトリの場合はリダイレクトしないようにしています。
    これで新サイトで存在するコンテンツには影響を与えません。

    RewriteRule ^news/(.+)$ /hp_archive/news/$1 [R=301,L]
    マッチしたパスの部分(例:12323/)を/hp_archive/news/に追加してリダイレクトします。
    301リダイレクトで永久移動を示すため、SEO的にも好ましい対応です。

    こちらの方法は、WordPress の canonical リダイレクトなどの影響を受ける前にサーバー側でリダイレクト処理されるので、確実に旧投稿リンクを hp_archive へリダイレクトできると思います。

    トピック投稿者 alitomo

    (@airarimichi)

    @rocketmartue さん色々とご享受頂きありがとうございます。
    ご連絡がおそくなり申し訳ありません。

    いただいたコードを試してみて結果をお伝えいたします。
    まず、

    function disable_canonical_for_nonexistent_posts( $redirect_url ) {
    // シングル投稿ページで、投稿が存在しない場合
    if ( is_singular('post') && ! have_posts() ) {
    return false; // canonicalリダイレクトをキャンセル
    }
    return $redirect_url;
    }
    add_filter( 'redirect_canonical', 'disable_canonical_for_nonexistent_posts' );

    上記コードですが、実行してみましたが、結果的には挙動は同じで、
    hoge.jp/news/12323/ を hoge.jp/hp_archive/news/12323/ へリダイレクトしたいが実際は hoge.jp/news/ が表示される。
    になりました。

    また.htaccess でのリダイレクトですが、

    <IfModule mod_rewrite.c>
    RewriteEngine On
    # /news/以下のリクエストで、実在するファイル・ディレクトリでなければリダイレクト
    RewriteCond %{REQUEST_URI} ^/news/(.+)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^news/(.+)$ /hp_archive/news/$1 [R=301,L]
    </IfModule>
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    この場合新サイトで投稿した投稿も全て/hp_archive/news/に飛ばされてしまいうまくいきませんでした。
    また何か方法がありましたらご享受いただければ幸いです。色々とありがとうございます。

    ※因みに、パーマリンクは
    旧サイトはnews/%post_id%
    新サイトはnews/%postname%
    になっているので、その辺りの条件をhtaccessに入れたらたら、うまくいくのかな?と思ったんですが
    正規表現が苦手なので困っております。

    • この返信は6日、 6時間前にalitomoが編集しました。
    モデレーター まーちゅう

    (@rocketmartue)

    ※因みに、パーマリンクは
    旧サイトはnews/%post_id%
    新サイトはnews/%postname%
    になっているので

    リクエストされたURLの/news/の直後が数字のみの場合の時だけ旧サイトのリンクとして hp_archive へリダイレクトするルールを考えてみました。

    .htaccess の WordPress リライトルールよりも上に、以下のコードを追加してみてください。

    <IfModule mod_rewrite.c>
    RewriteEngine On
    # /news/の直後が数字のみの場合にリダイレクトする
    RewriteCond %{REQUEST_URI} ^/news/([0-9]+)/?$
    RewriteRule ^news/([0-9]+)/?$ /hp_archive/news/$1 [R=301,L]
    </IfModule>
    トピック投稿者 alitomo

    (@airarimichi)

    @rocketmartue さん。おかげさまで私のやりたかったことが無事に出来ました。
    大変助かりました。@rocketmartue さん誠にありがとうございました。🙇

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • このトピックに返信するにはログインが必要です。