WordPress ログインURLを変更(WPS Hide Login)
WordPress は非常に便利で多機能な CMS ですが、そのまま使っていると「ログイン URL」が誰でも簡単に分かってしまうため、セキュリティ上のリスクが潜んでいます。
特にブルートフォース攻撃のような総当たりによる不正ログインは、ログインページが知られているだけで攻撃対象になります。
以下では、ログイン URL を変更してセキュリティを高める理由や、プラグイン「WPS Hide Login」の使い方、さらにログイン URL に Basic 認証を追加する方法まで、実践的に解説します。
更新日:2025年05月19日
作成日:2025年05月19日
WordPress ログイン URL
WordPress を https://yoursite.com/ にインストールした場合、デフォルトのログインページの URL は以下のとおりです。
- https://yoursite.com/wp-login.php
上記のほかにも、未ログインの状態で次のような URL にアクセスすると、ログインページ(wp-login.php)へ自動的にリダイレクトされます。※末尾にスラッシュがあってもなくても同じ動作になります。
- https://yoursite.com/wp-admin
- https://yoursite.com/dashboard
- https://yoursite.com/admin
- https://yoursite.com/login.php
- https://yoursite.com/login
ログインページにアクセスすると、以下のような画面が表示されます。
【参考】なぜリダイレクトされるのか?
これらのリダイレクトは、WordPress コアの wp-includes/canonical.php に定義されている wp_redirect_admin_locations() という関数によって処理されます。
この関数は template_redirect アクションにフックされており、アクセスされた URL がログインや管理画面に関連するショート URL だった場合に、適切な URL(通常は wp-login.php や wp-admin/)へリダイレクトするよう設計されています。
/**
* Redirects a variety of shorthand URLs to the admin.
*
* If a user visits example.com/admin, they'll be redirected to /wp-admin.
* Visiting /login redirects to /wp-login.php, and so on.
*
* @since 3.4.0
*
* @global WP_Rewrite $wp_rewrite WordPress rewrite component.
*/
function wp_redirect_admin_locations() {
global $wp_rewrite;
if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) {
return;
}
$admins = array(
home_url( 'wp-admin', 'relative' ),
home_url( 'dashboard', 'relative' ),
home_url( 'admin', 'relative' ),
site_url( 'dashboard', 'relative' ),
site_url( 'admin', 'relative' ),
);
if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins, true ) ) {
wp_redirect( admin_url() );
exit;
}
$logins = array(
home_url( 'wp-login.php', 'relative' ),
home_url( 'login.php', 'relative' ),
home_url( 'login', 'relative' ),
site_url( 'login', 'relative' ),
);
if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins, true ) ) {
wp_redirect( wp_login_url() );
exit;
}
}
なぜログイン URL を変更する必要があるのか?
前述の通り WordPress では、ログイン URL が初期状態から誰にでも分かる形で公開されているため、悪意のある第三者によってブルートフォースアタック(総当たり攻撃)を仕掛けられるリスクがあります。
そのため、ログイン URL を変更して、攻撃対象として発見されにくくすることは、WordPress のセキュリティ対策として効果的です。
ただし、WordPress のログイン URL(wp-login.php)はコアに組み込まれており、標準の設定だけでは変更できません。そのため、「WPS Hide Login」などのプラグインを使って、ログインURLを任意のものに変更するのが一般的な方法です。
WPS Hide Login
WPS Hide Login は、WordPress.org の公式ディレクトリに登録されている無料で利用できるプラグインです。2025年時点で 100万件以上のアクティブインストールがあり、レビュー評価も平均★4.8(5点満点中)と非常に高評価です。以下のような特徴があります。
ログインURLを簡単に変更できる
WPS Hide Login は、WordPressのデフォルトのログインURL(wp-login.php)を別のURLに置き換えることができます。設定画面で任意のスラッグ(例:my-sec-login)を入力するだけで、ログインURLがすぐに変更されます。
(例) https://yoursite.com/wp-login.php → https://yoursite.com/my-sec-login
軽量でシンプル
このプラグインは非常に軽量で、余計な機能や管理画面を追加せず、最小限の処理だけで動作します。そのため、パフォーマンスへの影響がほとんどなく、初心者にも扱いやすいのが特長です。
リダイレクトによって不正アクセスを防ぐ
ログインURLを変更すると、/wp-login.php や /wp-admin/ に直接アクセスしても404エラーを返すようになり、攻撃者がログインページに到達できなくなります。
攻撃対象になりやすい「wp-login.php」へのブルートフォースを根本から防止できます。
他のセキュリティプラグインとの干渉が少ない
多くのセキュリティ系プラグインは複数の機能を統合していますが、WPS Hide Login はログインURLの変更に特化しているため、他のプラグインとの競合が起きにくいのも利点です。
プラグインのインストールと有効化
- WordPress 管理画面から[プラグイン]→[プラグインを追加]にアクセスします。
- 検索欄に「WPS Hide Login」と入力します。
- 表示された「WPS Hide Login」プラグインをインストールして、有効化します。
プラグインを有効化した時点では、ログインURLは「/login」に変更されています。
これにより、wp-login.php や wp-admin など、従来のログインURLにアクセスしても 404 エラーページ が表示されるようになります(未ログイン時)。
https://yoursite.com/login
※このログインURLは、[設定] → [一般] にある「WPS Hide Login」の項目から任意の文字列に変更可能です。詳細は次項「ログイン URL の変更設定」を御覧ください。
ログイン URL の変更設定
プラグインを有効化すると、[設定]→[WPS Hide Login]で「一般設定」ページの一番下にログインURLを変更する項目が追加されます。
[設定]→[一般]でもアクセスできます(ページの一番下にスクロールします)。
ログインURLを「login」から、任意の文字列へ変更します。
例えば「secure-login-25_x」など任意の文字列を入力して「変更を保存」をクリックすることで、ログイン URL が以下のように変更されます。
https://yoursite.com/secure-login-25_x
「変更を保存」をクリックすると、新しいログインURLが有効になり、設定ページのトップに以下が表示されます。
新しいログインURLを設定する際の注意点
- 推測されにくい URL にする(推測しやすいURLでは、ログインページを隠しても攻撃者に見つけられる可能性があります)。
- URL はメモしておく(ログイン不能のリスク回避)
- URL をブラウザのブックマークに保存する
リダイレクト URL
必要に応じて、誰かが wp-login.php や wp-admin ディレクトリに未ログイン状態でアクセスを試みたときに転送されるページ(リダイレクト URL)を設定できます。
新しいログインURLを利用
一度、WordPressをログアウトして、これまでのログイン URL にアクセスすると、404ページ(リダイレクト URL に指定した転送先ページ)が表示されます。
新しく設定したログインURLにアクセスして、ログインページが正しく表示されることを確認します。
ログインURLを忘れてログインできなくなったときの対処法
WPS Hide Login でログインURLを変更後、ログインURLを忘れてしまい、ログインできなくなってしまったときの対処法としては、FTP または ファイルマネージャーでプラグインを一時的に無効化します。
以下が手順です。
- FTPクライアント(例:FileZilla)や サーバーのファイルマネージャー(例:ConoHa、Xserver、ロリポップ等の管理画面)にアクセス。
- WordPressのインストールディレクトリに移動。
- /wp-content/plugins/ フォルダを開く。
- wps-hide-login フォルダの名前を 一時的に変更(例:wps-hide-login-disabled)。
- 通常のログインURL(https://yoursite.com/wp-login.php)にアクセスしてログイン。
- WordPress ダッシュボードにログインできたら
- FTP やサーバーのファイルマネージャーでフォルダの名前を wps-hide-login に戻す
- 管理画面の「プラグイン」セクションで再有効化
- 必要に応じて、ログインURLの設定を再確認・変更
プラグインを削除して再インストールする必要は基本的にありません。リネームでOKです。
ログインURLに Basic 認証を設定
WPS Hide Login で変更したログイン URL に Basic 認証 を追加することも可能です。
Basic 認証を追加することで、ログインURL自体へのアクセスにひとつ壁を設けることになり、WPS Hide Login による隠蔽と合わせて、ブルートフォース攻撃に対するセキュリティを一層強化できます。
この方法では、Basic 認証の情報(ユーザー名とパスワード)を .htpasswd ファイルに、ユーザー名:ハッシュ化されたパスワード の形式で保存してあることを前提としています。
.htpasswd ファイルは、Webアクセス可能なディレクトリ内に置かないよう注意してください。
推奨されるのは、ドキュメントルート外の安全な場所(例:/home/youruser/.htpasswds/ など)です。
また、HTTP 接続ではパスワードが平文で送信されるため、必ず HTTPS 環境で運用してください。
以下は、WordPress の functions.php に記述することで、特定のログイン URL(例:「secure-login-25_x」)に Basic 認証をかけるコード例です。
WPS Hide Login のカスタムログイン URL は仮想的なルートなので、WordPress のルーティングが始まる前に URL を処理するため、init フックを使用します(template_redirect フックでは動作しません)。
add_action('init', function () {
// Basic 認証をかけたいログイン URL のスラッグを指定
$target_slugs = ['secure-login-25_x'];
// .htpasswdファイルの絶対パスを指定(実際の環境に合わせて変更してください)
$htpasswd_file = '/home/youruser/.htpasswds/mydomain.com/passwd/.htpasswd';
// 現在のURLのパス(クエリを除く)を取得
$request_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// HTTP認証ヘッダー(401レスポンス)を返す関数
function send_auth_request($message = 'Authentication required.') {
header('WWW-Authenticate: Basic realm="Restricted Login Page"');
header('HTTP/1.0 401 Unauthorized');
echo $message;
exit;
}
// 各スラッグと現在のパスが一致するかループでチェック
foreach ($target_slugs as $slug) {
// 正規表現で末尾のスラッシュの有無も含めて一致を確認
if (preg_match('#/' . preg_quote($slug, '#') . '/?$#', $request_path)) {
// 認証ヘッダーが送信されていない場合、認証を要求
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
send_auth_request();
}
// ブラウザから送信されたユーザー名とパスワードを取得
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
$authenticated = false;
// .htpasswd ファイルの存在と読み込み権限を確認
if (!file_exists($htpasswd_file) || !is_readable($htpasswd_file)) {
error_log("htpasswd file not found or not readable: $htpasswd_file");
header('HTTP/1.0 500 Internal Server Error');
echo 'Server configuration error.';
exit;
}
// .htpasswd の各行を取得(空行や改行を除く)
$lines = file($htpasswd_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// .htpasswd ファイルの読み込みに失敗した場合
if ($lines === false) {
error_log("Failed to load htpasswd file despite file_exists(): $htpasswd_file");
header('HTTP/1.0 500 Internal Server Error');
echo 'Server error.';
exit;
}
// .htpasswd ファイルの各行(ユーザー名:ハッシュ)を処理して、該当するユーザー名があるか確認
foreach ($lines as $line) {
// ユーザー名とハッシュに分割(.htpasswd にある各行を $user と $hash に分解)
list($user, $hash) = explode(':', $line, 2);
// 入力ユーザー名が一致し、パスワードも正しければ認証成功
if ($user === $username && password_verify($password, $hash)) {
$authenticated = true;
break;
}
}
// 認証に失敗した場合
if (!$authenticated) {
send_auth_request('Invalid credentials.');
}
break; // 一致したスラッグが見つかればループ終了(以降のチェックをスキップ)
}
}
});