福岡 ワードプレス システム開発 株式会社ジーティーアイ のブログ

WordPressプラグイン「GTI Public Preview」v1.1.1 アップデートのお知らせ

WordPressプラグイン「GTI Public Preview」v1.1.1 アップデートのお知らせ

WordPressプラグイン「GTI Public Preview」において、生成された公開プレビューURLにアクセスした際、環境によって 「503 Service Unavailable」エラーが発生してページが表示されない問題 を修正した バージョン 1.1.1 をリリースしました。

今回のアップデートでは、以下の対応を行っています。

  • プレビュー表示時のクエリ処理改善: テーマやコア側で予期せぬエラーが発生しないよう、クエリオブジェクトおよびフラグ処理を最適化しました。
  • WAF・セキュリティ機能との干渉回避: プレビューフラグの解除やトークン生成仕様の見直しにより、サーバーのWAF(SiteGuard等)による誤検知・通信遮断を防止しました。
目次[閉じる]

1. 発生していた問題

モニター環境等において、プラグインから発行された公開プレビューURLへアクセスした際、ページが正常に表示されず 「503 Service Unavailable」 が返される事象が確認されました。

該当するURLの例

https://example.com/?post_type=topics&p=63853&preview=true&public_preview=0.epcx4ipnkh ※リンク防止のため先頭を全角にしています。

URLパラメータの内訳・詳細

  • post_type=topics
    • 投稿タイプ:カスタム投稿タイプ「topics」を指定しています。
  • p=63853
    • 記事ID:対象となる下書き・プレビュー記事のIDです。
  • preview=true
    • プレビューフラグ:WordPress標準のプレビュー機能であることを示すパラメータです。通常はログイン中の管理者・編集者のみアクセスが許可されます。
  • public_preview=0.epcx4ipnkh
    • 公開トークン:本プラグイン(GTI Public Preview)が発行した一時アクセス用の認証トークンです。このトークンが一致した場合にのみ、未ログインユーザーでも閲覧を許可する設計となっています。

一見すると正常にパラメータが付与されているように見えますが、未ログイン状態でこのURLをリクエストすると、サーバー側で処理が遮断・中断され、503エラーとなっていました。

2. 原因の分析

調査の結果、主な原因として以下の要素が複合的に影響していることが判明しました。

  1. サーバー WAF によるアクセス遮断 日本のレンタルサーバー等に導入されている WAF(SiteGuard Lite など)は、攻撃や不正アクセスと判定した際に 403 Forbidden ではなく 503 Service Unavailable を返す仕様が一般的です。 未ログインの外部アクセスから preview=true が送信されたことや、自動生成されたトークンに含まれていたドット(.)がシグネチャに検知され、遮断対象となっていた可能性があります。
  2. WordPress のクエリフラグ・オブジェクトの不足によるエラー プラグイン側で下書き記事をメインクエリに差し込む際、$query->is_preview が true のまま残っていたため、テーマやWordPress本体が「ログイン中の管理者によるプレビュー」として処理を継続しようとし、未ログイン環境で例外やエラーを誘発していました。 また、$query->queried_object が未セットだったため、テーマ(特にカスタム投稿タイプ用テンプレート)内で get_queried_object()->ID 等を参照した際に PHP 8 で致命的エラー(Fatal Error: Attempt to read property on null)が発生し、サーバーが 503 を返す要因となっていました。

3. 主な変更点(v1.1.1)

① クエリフラグの最適化と queried_object の補完

プレビュー許可時、WordPressに「通常の個別記事」として安全にレンダリングさせるため、クエリの各種フラグとオブジェクトを補完しました。

  • $query->is_preview = false; を明示的に設定(未ログイン時のプレビュー誤判定やWAF検知を防止)
  • $query->is_singular = true; を追加
  • $query->queried_object = $post; および $query->queried_object_id = $post->ID; を追加(テーマ側の get_queried_object() の null 参照エラーを防止)

② トークン生成ロジックの改善(ドットの排除)

従来のトークン生成処理(Math.random().toString(36).slice(-12))では、先頭に 0. が含まれるケースがありました。 これを substring(2, 14) に改修し、純粋な英数字のみで構成されるトークンを生成するように変更しました。これにより、WAFのパストラバーサルや拡張子偽装ルールへの誤検知を回避します。

4. アップデートおよび設定の確認事項

プラグインを v1.1.1 にアップデート後、以下の点をご確認ください。

  • カスタム投稿タイプの設定確認: カスタム投稿タイプ(例: topics など)で公開プレビュー機能を利用する場合は、管理画面の 「設定」>「Public Preview」 にて対象の投稿タイプにチェックが入っているかご確認ください(初期値は 投稿 と 固定ページ のみ有効です)。
  • 既存トークンの再生成: すでにトークン内に .(ドット)が含まれている場合は、投稿編集画面の「Public Preview」メタボックスよりトークンを再生成(Generate)して記事を保存することをおすすめします。

📁 ダウンロード

最新版はこちらから取得できます:

注意

⚠️ 免責およびお願い

本ツールはサイト制作時にプレビュー画面を共有するためのサポートとして
株式会社ジーティーアイ(GTI)が独自に開発・公開しているものです。

オープン配布のため、動作保証・個別サポート・苦情対応は一切行いません。
ご利用は自己責任でお願いいたします。

ご自身のサイトでの運用テスト・バックアップを行ったうえでご利用ください。

この記事をシェアする

記事一覧へ戻る

コメント Comments

コメント一覧

コメントはありません。

コメントする

Throws SPAM Away を使っていますよ、もちろん。

トラックバックURL

https://blog.gti.jp/post-75559/trackback/

関連記事 Relation Entry

IP あなたが接続中のIPアドレス:216.73.217.1