WordPressで投稿者アーカイブを無効にする方法|?author=Nのユーザー名列挙対策まで

WordPressには、投稿者ごとの記事一覧を表示する投稿者アーカイブ/author/ユーザー名/)があります。1人運営のブログでは不要なうえ、URLにログイン名が露出するため、セキュリティ上無効にしたいことがあります。この記事では、アーカイブの無効化に加えて、本命である「ユーザー名の列挙」対策まで解説します。

本当に防ぎたいのは「ユーザー名の列挙」
アーカイブページを消すだけでは不十分です。攻撃者は ?author=1?author=2… と連番でアクセスし、WordPressが /author/ログイン名/ へリダイレクトする挙動を利用してログイン名を割り出します(ユーザー列挙)。この ?author=N を止めることが対策の中心です。
この記事でわかること

  • 投稿者アーカイブを404にする(is_author()
  • ?author=N の列挙を止める(本命)
  • 404にするか・リダイレクトするかの違い
  • REST APIなど他の漏洩経路への対処
スポンサーリンク

方法1:functions.phpで404にする+列挙をブロックする(推奨)

子テーマの functions.php に次のコードを追加します。前半で投稿者アーカイブを404にし、後半で?author=N の列挙リクエストをリダイレクト前に止めます。この2つをセットにするのがポイントです。

functions.php:アーカイブ404+?author=N列挙ブロック
// (1) 投稿者アーカイブページを404にする
add_action('template_redirect', function () {
  if (is_author()) {
    global $wp_query;
    $wp_query->set_404();
    status_header(404);
    nocache_headers();
  }
});

// (2) ?author=N の列挙を、リダイレクトでログイン名が漏れる前に止める
add_action('init', function () {
  if (!is_admin() && isset($_GET['author'])) {
    wp_safe_redirect(home_url('/'), 301);
    exit;
  }
});
なぜ init 段階で止めるのか
?author=1 は、WordPressが /author/ログイン名/リダイレクトする時点でログイン名が漏れます。そのリダイレクトより前の init で処理すれば、名前を出さずにトップへ戻せます。アーカイブ側(template_redirect)と列挙側(init)の両方を塞ぐのが確実です。

404にする?リダイレクトする?の違い

「アクセスされたときにどう返すか」で2つの考え方があります。目的に合わせて選びます。

返し方 挙動 向いている場面
404set_404() 「ページは存在しない」と返す そのページを完全に無くしたい・検索にも出したくない
301リダイレクト トップページ等へ転送する 訪問者を別ページへ誘導したい

アーカイブページ自体は404で消し、列挙用の ?author=Nリダイレクトで名前を隠す、という上記の組み合わせが実用的です。noindexにしてインデックスだけ防ぐ方法もあります(後述のFAQ)。

方法2:セキュリティプラグインを使う

コードを書きたくない場合は、SiteGuard WP PluginWordfenceiThemes(Solid)Security などのセキュリティプラグインに「ユーザー名(作者)ページの無効化」「ユーザー列挙の防止」オプションがあります。設定を有効にするだけで、?author=N の列挙まで含めて対策できるものが多いです。

方法3:.htaccess(Apache)で制限する

Apacheサーバーなら .htaccess でも対処できます。クエリ文字列の ?author= もあわせてブロックするのがポイントです(URL部分だけを弾くと ?author=N をすり抜けます)。

.htaccess:/author/ と ?author= を制限
RewriteEngine On
RewriteBase /
# ?author=数字 の列挙をブロック
RewriteCond %{QUERY_STRING} (^|&)author=\d+ [NC]
RewriteRule .* / [L,R=301]
# /author/ へのアクセスをブロック
RewriteRule ^author/ / [L,R=301]
WordPress管理ブロックの外に書く
WordPressは .htaccess# BEGIN WordPress# END WordPress の部分を自動で書き換えるため、そこに書くと消えることがあります。カスタムのルールはそのブロックの外(上か下)に書いてください。Nginxの場合は .htaccess は使えないため、サーバー設定(location ブロック)で対応します。編集前に必ずバックアップを取りましょう。

投稿者名は他の経路からも漏れる

アーカイブ対策だけでは片手落ち
ログイン名・投稿者名は次からも露出します。目的がユーザー名の秘匿ならまとめて対処してください。
REST API/wp-json/wp/v2/users で投稿者一覧が取得できる場合がある
XMLサイトマップwp-sitemap.xml の投稿者一覧 → wp-sitemap.xmlから投稿者を削除する方法
表示名の使い回し:公開名をログイン名と同じにしない → ログインIDと表示名の違い・変更方法
RSSフィードの投稿者名RSSフィードの投稿者名を非表示にする方法

よくある質問(FAQ)

Qアーカイブを消したのに ?author=1 でログイン名が分かってしまいます。
Aアーカイブページの404だけでは ?author=Nリダイレクトによる列挙を防げません。方法1の後半のように init$_GET['author'] を検知してリダイレクト前に処理するか、.htaccess でクエリ文字列ごとブロックしてください。
Q無効化ではなく検索に出さない(noindex)だけにしたい。
Ais_author() のときに <meta name="robots" content="noindex"> を出力します。add_action('wp_head', function () { if (is_author()) { echo '<meta name="robots" content="noindex,follow">'; } });。Yoast SEOなら「検索での見え方 → 作成者アーカイブ」でnoindexに設定できます。
QURLに出る投稿者スラッグ(ユーザー名)を変えたい。
AURLのスラッグは user_nicename で決まり、初期値はログイン名と同じです。これを別の値に変えると露出を減らせます(管理画面からは直接変更できずDB操作が必要)。あわせて公開される表示名もログイン名と別にしておきましょう(表示名の変更方法)。

まとめ

  • アーカイブ無効化is_author()set_404()(存在しないと返す)
  • 本命の列挙対策init?author=N をリダイレクト前に止める
  • 404かリダイレクトか:ページを消すなら404、誘導するなら301と使い分け
  • 他経路も塞ぐ:REST API・サイトマップ・表示名・RSSをまとめて対処

「アーカイブを消す」だけで満足せず、?author=N の列挙と他の漏洩経路までセットで対策するのが、本当の意味でのユーザー名保護です。