2026年6月24日

2026年6月24日

WordPressでHTTP 451(Unavailable For Legal Reasons)を返す方法と原因の調べ方

HTTP 451とは

451 Unavailable For Legal Reasons は、法的な要請を受けてリソースへのアクセスを止めていることを示すステータスコードで、RFC 7725 で定められています。RFC の要点は次のとおりです。

  • 応答の本文で、要請の内容(誰からの要請か、根拠となる法令、対象となる人やリソースの範囲)を説明することが望ましい。
  • アクセスを止めている者は、自分を示す URL を Link ヘッダーに rel="blocked-by" で入れることが望ましい。示すのは「実際に止めている者」で、止めるよう求めた者ではない。
  • 451 を返すのは元のサーバーとは限らず、ISP やキャッシュ事業者などの途中の事業者のこともある。
  • 451 の応答は、明示的な指定が無ければキャッシュしてよい。

似たステータスコードとの違い:

コード 意味
403 Forbidden 権限が無いのでアクセスを拒否する
404 Not Found 見つからない(理由は示さない)
410 Gone 意図的に削除し、今後も戻らない
451 Unavailable For Legal Reasons 法的な理由でアクセスを止めている

WordPress 本体は自分から 451 を返すことはありませんが、ステータスの説明文の一覧(get_status_header_desc())には 451 が含まれているため、status_header( 451 ) や wp_die() で返すことはできます。

自分のサイトで451が出たとき:どこが返しているか調べる

451 はサーバー、CDN、WAF、プラグイン、回線事業者のどこからでも返されえます。外から見て 451 になる URL について、次の順に確かめます。

1. ヘッダーを見る

curl -sI https://example.com/問題のページ/

Link: <...>; rel="blocked-by" があれば、その URL が止めている者を示しています。Server ヘッダーや、CDN が付ける独自のヘッダーからも、どこが応答したかの手がかりが得られます。

2. CDNを通さずに元のサーバーへ聞く

サーバーにログインし、自分自身に直接リクエストします。--resolve で名前解決だけを差し替えるため、証明書の確認もそのまま行われます。

curl -sI --resolve example.com:443:127.0.0.1 https://example.com/問題のページ/
  • ここで 200 が返るなら、451 は元のサーバーより外側(CDN・WAF・回線事業者など)で返されています。その事業者の管理画面や窓口で確認します。
  • ここでも 451 なら、サーバーの設定か WordPress 側です。

3. ログと設定を探す

# アクセスログで 451 を返したリクエスト(combined 形式では9番目の項目がステータス)
sudo awk '$9 == 451' /var/log/nginx/access.log | tail -n 20
sudo awk '$9 == 451' /var/log/apache2/access.log | tail -n 20

# Web サーバーの設定に 451 を返す記述があるか
sudo grep -rn '451' /etc/nginx/ /etc/apache2/ 2>/dev/null

# WordPress のコードに 451 を返す処理があるか
grep -rnE '451|Unavailable For Legal' /var/www/html/wp-content --include=*.php
grep -n '451' /var/www/html/.htaccess

どこにも見つからない場合は、ホスティング事業者に問い合わせます。

法的な要請でページを止める手順

裁判所の命令や権利者からの正式な削除要請を受けて特定のページを止める場合の手順です。要請に応じるかどうか、どの範囲を止めるかの判断は、弁護士などの専門家に相談してください。ここでは技術的な手順だけを扱います。

1. 投稿を下書きに戻す

まず投稿自体を非公開にします。URL だけを 451 にしても、投稿が公開のままだと REST API(/wp-json/wp/v2/posts/<ID>)、フィード、サイトマップから本文が取得できてしまうためです。

wp post update 123 --post_status=draft

(123 は対象の投稿 ID に置き換えます。管理画面なら、投稿の編集画面で状態を「下書き」に変えて更新します。)

これでその URL は 404 になります。理由を示す必要がなければ、ここで終わりにしても構いません。

2. 止めたURLに451を返す

止めていることを利用者に示したい場合は、次のいずれかで 451 を返します。どれも「お知らせ」ページ(例では /legal-notice/)を rel="blocked-by" で示しています。お知らせページは先に作っておきます。

WordPressで返す(mu-plugin)

サーバーの設定を変えられない環境でも使えます。wp-content/mu-plugins/legal-block-451.php として置きます。

<?php
/**
 * Plugin Name: Legal Block 451
 * Description: 法的な要請で公開を停止したURLに 451 を返す。
 */

add_action( 'template_redirect', function (): void {
    if ( ! is_404() ) {
        return;
    }

    // 公開を停止したURLのパス(先頭と末尾のスラッシュは付けない)
    $blocked = array(
        'blocked-post',
    );

    global $wp;
    if ( ! in_array( $wp->request, $blocked, true ) ) {
        return;
    }

    $notice = home_url( '/legal-notice/' );
    header( 'Link: <' . esc_url_raw( $notice ) . '>; rel="blocked-by"' );

    wp_die(
        '<p>このページは、法的な要請により公開を停止しています。詳しくは <a href="' . esc_url( $notice ) . '">お知らせ</a> をご覧ください。</p>',
        '451 Unavailable For Legal Reasons',
        array( 'response' => 451 )
    );
}, 1 );
  • 投稿を下書きにした後の 404 になったリクエストだけを対象にしているため、公開中のページには影響しません。
  • 優先度を 1 にしているのは、WordPress 本体の redirect_canonical()(優先度10)が似た URL へ転送してしまう前に処理するためです。
  • wp_die() はキャッシュさせないヘッダー(Cache-Control: no-cache, must-revalidate, max-age=0, no-store, private)も送ります。

2026年10月時点の WordPress 6 系・PHP 8.3 の環境で、公開中は 200、下書き後は 451 と Link ヘッダーが返り、ほかの存在しない URL は 404 のままであることを確認しています。

Nginxで返す

server ブロックに書きます。error_page で内部転送すると元の location で付けたヘッダーは引き継がれないため、Link ヘッダーはお知らせ用の HTML を返す location に付けます。always を付けないと、add_header は 451 の応答には付きません。

location = /blocked-post/ {
    return 451;
}

error_page 451 /451.html;
location = /451.html {
    internal;
    add_header Link '<https://example.com/legal-notice/>; rel="blocked-by"' always;
}

/451.html は公開ディレクトリに置く説明用の HTML です。反映は sudo nginx -t で構文を確かめてから sudo systemctl reload nginx で行います。なお Nginx は 451 の応答行に説明文を付けず、HTTP/1.1 451 とだけ返します。

Apacheで返す(.htaccess)

# BEGIN WordPress より上に書きます。mod_alias の Redirect は、300番台以外のステータスを指定するときは転送先の URL を省略します(Apache 公式マニュアル)。

ErrorDocument 451 /451.html

<IfModule mod_headers.c>
    Header always set Link "<https://example.com/legal-notice/>; rel=\"blocked-by\"" "expr=%{REQUEST_STATUS} == 451"
</IfModule>

Redirect 451 /blocked-post/
  • Redirect は前方一致なので、/blocked-post/ で始まるすべての URL が対象になります。
  • Header を使うには mod_headers が有効である必要があります(sudo a2enmod headers)。

Nginx・Apache の例は、それぞれ公式の Docker イメージ(Nginx 1.30 系、Apache 2.4 系)で 451 と Link ヘッダーが返ることを確認しています。

3. 確認する

curl -sI https://example.com/blocked-post/ | grep -iE '^(HTTP|link)'

HTTP/... 451 と Link: <...>; rel="blocked-by" が表示されれば設定どおりです。

運用上の注意

  • キャッシュ: RFC 7725 では 451 はキャッシュしてよい応答です。ページキャッシュや CDN を使っている場合は、設定後に対象 URL のキャッシュを削除し、要請が解除されて公開し直すときにも削除します。
  • お知らせページ: どの要請に基づいて止めているかを、差し支えない範囲で説明します。要請の内容を公表できない場合は、本文を短くするか、451 ではなく 404 のままにする選択肢もあります。
  • 解除するとき: 451 を返す設定を外してから、投稿を公開に戻します。
  • 検索結果: Google の説明では、4xx(429 を除く)を返す URL はインデックスの対象にならず、すでにインデックスされていれば削除されます。一時的な停止でも、再公開後に再びクロールされるまでは検索結果に戻りません。

まとめ

  • 451 は法的な要請でアクセスを止めていることを示す(RFC 7725)。Link ヘッダーの rel="blocked-by" で止めている者を示す。
  • 451 が出たら、ヘッダー、CDN を通さないリクエスト、ログと設定の順に、どこが返しているかを調べる。
  • ページを止めるときは、まず投稿を下書きにして REST API やフィードからも消し、そのうえで URL に 451 を返す。
  • 返す方法は WordPress の mu-plugin、Nginx の return 451、Apache の Redirect 451 のいずれか。設定後は curl -I で確かめ、キャッシュを削除する。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲