【SWELL】PV数が計測できない?コンソールに「401 Unauthorized」エラーが出た時の対処法

当ページのリンクには広告が含まれています。
【SWELL】PV数が計測できない?コンソールに「401 Unauthorized」エラーが出た時の対処法のアイキャッチ画像

最近、SWELLのPV数が妙に少ない…「もしかしてPVが計測されていない?」と感じたことはありませんか?

気になってブラウザの検証ツール(コンソール)を確認してみると、swell-ct-pv 401 (Unauthorized) というエラーが大量に出ていました!

SWELLのPV計測用のREST APIがコンソールエラーとして出ている開発者ツールの画像

「SWELLの不具合か?」と思いましたが、原因はまったく別のところにありました。
この記事では、エラーの原因と解決方法を、SE視点でわかりやすく解説します。

まず先に、結論から。

結論:PVが計測されない原因はコレ!

【原因】
セキュリティプラグイン(CloudSecure / SiteGuard)の「REST API 無効化」が SWELL の PV 計測をブロックしているため。

【解決策】

  1. セキュリティプラグインの REST API 制限を無効化する
  2. 必要に応じてfunctions.phpで必要最小限の制限に戻す(玄人向け)

手っ取り早く解決手順を知りたい方はこちら>>

  • なぜエラーが起きたのか
  • プラグイン設定を変えるだけでは不十分な理由

これらを踏まえて、正しい解決手順を紹介します。

目次

【現象】SWELLのPVが0になる原因は?「swell-ct-pv」401/403コンソールエラーを確認

SWELLのPV計測機能を使い始めましたが、いつまで経ってもPVが0のまま
これが、不具合に気づくきっかけでした。

ある日、ページの速度を計測するPageSpeed Insightsを見てみると

PageSpeed Insightsのおすすめの方法でのコンソールエラー

「おすすめの方法」のスコアが、100点から96点に下がっていました。
原因を見ると、ブラウザのエラーがコンソールに記録されましたとのことで、エラーを出しているのは以下のスクリプト達でした。

fufulog.blog 自社
…v2/swell-lazyload-contents?placement=after_article&post_id=42:1:0(fufulog.blog)
Failed to load resource: the server responded with a status of 403 (Forbidden)
…v2/swell-ct-pv:1:0(fufulog.blog)
Failed to load resource: the server responded with a status of 403 (Forbidden)
…js/main.min.js?ver=2.15.0:1:405(fufulog.blog)
route:swell-ct-pv [object Object]
…js/main.min.js?ver=2.15.0:1:405(fufulog.blog)
route:swell-lazyload-contents?placement=after_article&post_id=42 [object Object]
…js/main.min.js?ver=2.15.0:1:388(fufulog.blog)
TypeError: Failed callRestApi: 403 at https://fufulog.blog/wp-content/themes/swell/build/js/main.min.js?ver=2.15.0:1:297
…js/main.min.js?ver=2.15.0:1:388(fufulog.blog)
TypeError: Failed callRestApi: 403 at https://fufulog.blog/wp-content/themes/swell/build/js/main.min.js?ver=2.15.0:1:297
Kea(ケア)

swell-ct-pvとSWELLのPV周りのところで403エラーが発生していました。

エラーを追ってみると、Failed callRestApiと書いてあり、どうもREST API周りで、403エラー( =アクセスが拒否されました)が原因とつきとめることができました。

SWELLのPV計測機能(swell-ct-pv)だけでなく、遅延読み込み(swell-lazyload-contents)なども同様に 403 エラーで弾かれている状態です。

これでは正確なPV数が把握できないどころか、サイトの表示速度や利便性にも悪影響が出てしまいます。

※私の環境では、デベロッパーコンソールで401(Unauthorized)、PageSpeed Insightsでは403(Forbidden)と表示されていました。

原因:セキュリティプラグインがSWELLのREST API(PV計測)をブロックしていた

原因は、導入していたセキュリティプラグイン(私の場合はCloudSecure WP Security)の設定でした。

このプラグインには「REST APIを無効化(制限)する」という機能があります。
外部からの攻撃を防ぐための機能ですが、SWELLのPV計測などの便利機能もREST APIを使用しているため、まとめてブロックされていたのです。

🔧ここをOFFにすれば解決!
CloudSecure WP Security →「REST API 無効化」を無効に設定

CloudSecure WP Securityのダッシュボード画像
Kea(ケア)

ちなみに、CloudSecure WP Securityプラグインは、エックスサーバーでWordPressのブログを開設すると自動インストールされる国産セキュリティプラグインです!

【簡単に解説】そもそもREST APIとは?なぜブロックされる?

はる

そもそもREST APIって何?専門用語でわからないよ。

REST APIとは、簡単に言うとサイトの裏側と通信するための窓口です。
PV計測や画像の遅延読み込みなど、SWELLの便利機能はここを使って動いています。

SWELLはこの窓口を使って、「記事が見られたよ(PV計測)」や「画像を読み込んで」といった指示を裏側でこっそりWordPress(ブログ本体)に送っています。

セキュリティプラグインは「この窓口が開いていると泥棒(攻撃者)も入ってくるかも!」と判断して、窓口を板張りにして封鎖してしまった……というのが今回のエラーの正体です。

解決策:「REST API 無効化」を有効→無効

ここまでの内容で、REST APIが制限されることでSWELLのPVカウント機能や遅延読み込み機能が動作しないというのがわかったかと思います。

ここからは、どうやってこの問題を解決するのか具体的に解説していきます!

CloudSecureのREST API無効化を有効から無効へと変更

CloudSecure_RESTAPI無効化のスクリーンショット

一番簡単な解決策は、CloudSecure WP Securityの設定を変更することです。

REST API 無効化:有効→無効

SiteGuard WP Pluginを使っている人向け

SiteGuardのRest API無効化画面

SiteGuardを使っていて同様のエラーに悩まされている方は、ユーザ名漏えい防御のREST API無効化のチェックを外して保存すればOKです。

はる

画像ではユーザ名漏洩防御が無効化されていますが、有効のままで問題ありません!

REST APIのセキュリティを「無効」にしても本当に大丈夫?

「セキュリティ設定を無効にする」と聞くと、「えっ、ウイルスとか大丈夫なの?」と不安になるかもしれませんが、結論から言うと全く問題ありません。

理由は大きく2つあります。

  1. そもそも「標準」に戻るだけだから
    REST APIは、現在のWordPressにおいて標準で「有効」になっている機能です。SWELLのような高機能テーマや、記事を書くブロックエディタ(Gutenberg)は、この機能を使って動くのが当たり前になっています。
    今回のエラーは、プラグイン側が「念の為、全部ブロックしておこう」と少し過剰に防衛しすぎてしまった(過剰防衛)ことが原因です。 そのため、設定をOFFにしても「危険になる」わけではなく、本来の標準的なWordPressの状態に戻るだけなので安心してください。
  2. プラグインの制限が「大雑把すぎる」から
    ここからは技術的な話になりますが、多くのセキュリティプラグインの制限機能は「0か100か(全部止めるか、全部通すか)」という大雑把な作りになっています。セキュリティを高めたいからといって、SWELLのPV計測のような必要な通信まで遮断してしまうのは、実用性に欠けますよね。
Kea(ケア)

とはいっても、PV計測など一部の機能のためだけにREST API制限機能を全て無効化するのはエンジニアとしてイケてる解決策とは言えません。

そこで今回は、以下のSE流のアプローチで解決します。

  1. プラグインの大雑把な制限は一旦OFFにする。
  2. その代わり、functions.phpを使ってSWELLだけは通すという精密なフィルターを自分でかける。

こうすることで、利便性とセキュリティを両立させた最強の状態を作ることができます。
それでは、具体的なコードの設定に進みましょう。

はる

ここからは、コードを書いたり専門的な話になるので「REST API無効化」を無効にするだけ解決したという方は、まとめまで読み飛ばしちゃってください!

解決策(応用版):REST APIフィルターを自作する

手順①:セキュリティプラグインのREST API制限を無効にする

まず、使用しているセキュリティプラグインの設定画面を開き、REST API無効化の設定を「無効」にしてください。
※これで一時的に全開放されますが、すぐに次の手順で制限をかけるので大丈夫です。

なぜホワイトリスト設定ではダメだったのか?

多くのプラグインには「除外リスト(ホワイトリスト)」があります。
「じゃあSWELLを除外すればいい」と考えたのですが、今回のケースではホワイトリストへの追加では解決に至りませんでした。

なぜなら、CloudSecureのホワイトリストはプラグインしか除外対象に選べず、テーマであるSWELLを選択できない仕様になっていたためです。(バージョン1.3.x時点)

そのため、今回はプラグインの機能には頼らず、コード(functions.php)で制御するという確実な方法を取ることにしました。

手順②:functions.phpにコードを追記する

次に、テーマの functions.php にSWELLの機能だけREST APIでの通信を許可するというコードを追加します。

WordPress管理画面の
「外観」>「テーマファイルエディター」 を開き、
「SWELL CHILD(子テーマ)」functions.php を選択します。

SWELL CHILDのfunctions.phpを選択している様子

ファイルの一番下の行に、以下のコードをコピペして貼り付けてください。

/**
 * REST APIのアクセス制限(ホワイトリスト形式)
 * セキュリティプラグインの代替として機能し、SWELLや特定プラグインのみ許可する
 */
add_filter( 'rest_authentication_errors', function( $result ) {

    // 1. 既に認証エラーが発生している、または管理者権限等で許可済みの場合は何もしない
    if ( ! empty( $result ) ) {
        return $result;
    }

    // 2. ログイン中のユーザーは無条件で許可
    // ※SWELLの設定保存やキャッシュクリア等の管理機能はここで許可されます
    if ( is_user_logged_in() ) {
        return $result;
    }

    // 3. 許可リストの定義(ホワイトリスト)
    // URLにこれらの文字列が含まれていれば許可します
    $allowed_endpoints = [
        // SWELL機能(一般公開が必要なもの)
        'swell-ct-pv',              // PV計測
        'swell-ct-btn-data',        // SWELLボタンの計測(クリック数など)
        'swell-ct-ad-data',         // SWELL広告の計測(表示回数・クリック数)
        'swell-lazyload-contents',  // 遅延読み込み機能
        'swell-term-list',          // ターム(カテゴリー)一覧取得
        
        // WordPressコア機能
        '/wp-json/oembed/',         // ブログカード等の埋め込み
        '/wp-json/contact-form-7/', // Contact Form 7
        '/wp-json/akismet/',        // Akismet
    ];

    // 4. リクエストURLの取得
    $request_uri = $_SERVER['REQUEST_URI'];

    // 5. ホワイトリストの判定
    foreach ( $allowed_endpoints as $endpoint ) {
        if ( strpos( $request_uri, $endpoint ) !== false ) {
            return true; // 許可リストに含まれていれば通す
        }
    }

    // 6. 許可されなかったアクセスは401エラーで遮断
    return new WP_Error( 
        'rest_forbidden', 
        'REST API access is restricted by function.', 
        array( 'status' => 401 ) 
    );

}, 99 );

※注意点
必ず「親テーマ」ではなく「子テーマ(SWELL CHILD)」に記述してください。親テーマに書くとアップデートで消えてしまいます。

解説:このコードで何をしているのか(エンジニア向け)

少し技術的な解説をすると、このコードでは以下の処理を行っています。

  1. rest_authentication_errors フック: REST APIへのアクセスがあった時に割り込む処理です。
  2. 優先度99: 他のプラグインなどの処理が終わった最後に実行されるようにしています。
  3. ホワイトリスト方式: $allowed_endpoints 配列に定義した文字列(swell-ct-pv など)がURLに含まれている場合のみアクセスを許可し、それ以外の非ログインユーザーからのアクセスは強制的に 401 Unauthorized を返しています。

これにより、セキュリティレベルを維持したまま、SWELLに必要な通信だけを通す穴を正確に開けることができました。

【重要】SWELLアップデート時の注意点
今回紹介したコードは、あくまで「執筆時点のSWELL」で使われているREST APIを許可するものです。
将来的にSWELLのアップデートで新しい機能が追加された場合、その機能もREST APIを使っていると、このコードの許可リストに含まれていないためブロックされて動かない可能性があります。
もしSWELLアップデート後に「あれ、新機能が動かない?」と思ったら、親テーマ内の lib/rest_api.php を確認し、新しいAPI名称が増えていないかチェックするようにしてください!

まとめ

今回は、SWELLでPV計測や遅延読み込みが動かなくなるswell-ct-pv401エラーの原因と、システムエンジニア目線での安全な対処法を解説しました。

記事のポイントを振り返りましょう。

  • エラーの原因
    CloudSecureなどのセキュリティプラグインが、SWELLに必要な通信(REST API)までブロックしていたこと。
  • 簡単な解決策
    プラグイン側の「REST API制限」設定を無効にする(これでも標準状態に戻るだけなので基本は安全)。
  • SE流の解決策(SE視点の最適解)
    プラグインの制限は無効にしつつ、functions.phpで「SWELL機能のみ許可するフィルター」を自分でかける。

→ 正しく動作すると、PageSpeed Insightsのスコアも改善!

セキュリティプラグインは導入するだけで安心感がありますが、時には過剰防衛によって必要な機能まで止めてしまうことがあります。

「設定画面で解決できない時は、コードで制御する」という選択肢を持っておくと、トラブルが起きても冷静に対処できるようになります。
SWELLの便利な機能をフル活用して、快適なブログ運営を続けていきましょう!

あわせて読みたい:SEのITガジェット術関連記事

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次