コンテンツにスキップ

クエリ文字列のソート

クエリ文字列のソートは、Cloudflareのキャッシュを確認する前に、クエリ文字列を一貫した順序にソートすることでキャッシュヒット率を向上させます。

デフォルトでは、Cloudflareのキャッシュは、URLのクエリ文字列の順序が異なる場合、リソースを別々に扱います。たとえば、次のリソースは別々にキャッシュされます:

  • /video/48088296?title=0&byline=0&portrait=0&color=51a516
  • /video/48088296?byline=0&color=51a516&portrait=0&title=0

クエリ文字列のソートは、この動作を変更します。同じ名前のクエリ文字列が2つ存在する場合、URLはパラメータの値でソートされます。たとえば:

/example/file?word=alpha&word=beta/example/file?word=beta&word=alpha

は次のようにソートされます:

/example/file?word=alpha&word=beta

利用可能性

Free Pro Business Enterprise

Availability

No

No

No

Yes


クエリ文字列のソートを有効にする

クエリ文字列のソートを有効にするには:

  1. Cloudflareダッシュボードにログインします。
  2. アカウントとゾーンを選択します。
  3. キャッシング > 設定に移動します。
  4. クエリ文字列のソートを有効にするのトグルをオンに切り替えます。

WordPress管理ページでの予期しない動作

サイトやアプリケーションが正確なクエリ文字列の順序を必要とする場合、クエリ文字列のソートを有効にすると予期しない動作が発生する可能性があります。

たとえば、WordPressの管理UIでは、次のような動作が見られることがあります:

  • メディアライブラリにメディアが表示されない
  • 外観 > カスタマイズを通じてサイトをカスタマイズできない
  • 外観 > ウィジェットでウィジェットをサイドバーにドラッグできない
  • 外観 > メニューでメニューを編集できない

なぜこれが起こるのかを理解するために、WordPressは管理インターフェースを高速化するためにJavaScriptファイルを連結することに注意してください。WordPressがこれを実装する方法は、クエリ文字列内にload[]パラメータが複数回出現し、そのパラメータの順序が重要であることを含みます。

問題の特定

以下のスクリーンショットは、メディアライブラリ内のリソースが正しくレンダリングされず、ブラウザのデバッグコンソールがページでエラーを表示している例を示しています:

メディアライブラリ内のリソースが正しくレンダリングされない

ページload-scripts.phpが読み込まれると、ブラウザはCloudflareに次のリクエストを送信します:

/wp-admin/load-scripts.php?c=0&load%5B%5D=hoverIntent,common,admin-bar,underscore,shortcode,backbone,wp-util,wp-backbone,media-models,wp-plupload,wp-mediaelement,wp-api-r&load%5B%5D=equest,media-views,media-editor,media-audiovideo,mce-view,imgareaselect,image-edit,media-grid,media,svg-painter&ver=5.0.3

クエリ文字列のソートが有効になっている場合、Cloudflareはリクエストのクエリ文字列内のパラメータと値をソートし、次のようになります:

/wp-admin/load-scripts.php?c=0&load%5B%5D=equest,media-views,media-editor,media-audiovideo,mce-view,imgareaselect,image-edit,media-grid,media,svg-painter&load%5B%5D=hoverIntent,common,admin-bar,underscore,shortcode,backbone,wp-util,wp-backbone,media-models,wp-plupload,wp-mediaelement,wp-api-r&ver=5.0.3

load[]パラメータが入れ替わったことに注意してください。equestはアルファベット順でhoverIntentの前に来るべきです。

これが発生すると、ブラウザコンソールに次のようなエラーが表示されることが多くなります:

_____ is not defined at load-scripts.php?c=0&load[]=...

この種のエラーは、クエリ文字列のソートが意図せずにWordPress管理ページの機能を壊していることを示しています。

ソート後、クエリはCloudflareのキャッシュインフラストラクチャに送信され(リソースがCloudflareのキャッシュにない場合やキャッシュ可能でない場合はオリジンサーバーにも送信されます)、オリジンサーバーは異なる順序で連結されたスクリプトを提供します。スクリプトは他のスクリプトに依存する可能性があるため、このプロセスは依存関係を壊す可能性があります。

問題への対応

クエリ文字列の使用に関するサイトやアプリケーションの動作を分析することから始めてください。複数の可能なクエリ文字列の配置で提供されるアセットはありますか?

たとえば、画像リサイズエンドポイントや検索フォームがあり、クエリパラメータの順序が異なる場合があります - 幅、高さ、バージョンなど - それでもユニークなパラメータの組み合わせが単一の関連アセットを指す場合があります。

問題を最小限に抑えるために、次のことを検討してください:

  • この機能がサイトのどの部分にも価値を追加しないと確信している場合は、サイトのクエリ文字列のソートを無効にします。Cloudflareはキャッシングアプリでこのオプションをデフォルトで無効にしています。
  • キャッシュルールを使用して、クエリ文字列のパラメータの順序を保持することが重要でないURLに対してクエリ文字列のソートを有効にします(キャッシュキー > クエリ文字列をソートオン)。
  • あるいは、特定のパラメータの順序が必要なURLに対してクエリ文字列のソートを無効にするためにキャッシュルールを使用します。たとえば、/wp-admin/load-scripts.phpで始まるURIパスや、同様の要件を持つURLに対してキャッシュキー > クエリ文字列をソートオフを設定します。

キャッシュルールについて詳しく知るには、キャッシュルールを訪れてください。


関連リソース