Query String Sort(查询字符串排序) 在检查 Cloudflare 缓存之前,首先将查询字符串排序为一致顺序,从而提高缓存命中率。
默认情况下,如果 URL 查询字符串顺序不同,Cloudflare 的缓存会将资源视为不同。例如,这些资源被分别缓存:
/video/48088296?title=0&byline=0&portrait=0&color=51a516/video/48088296?byline=0&color=51a516&portrait=0&title=0
Query String Sort 改变此行为。如果存在两个同名的查询字符串,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 |
要启用 Query String Sort:
- 登录 Cloudflare 仪表板 ↗。
- 选择您的账户和 zone。
- 前往 Caching(缓存) > Configuration(配置)。
- 对于 Enable Query String Sort(启用查询字符串排序),将开关切换为 On(开启)。
当站点或应用程序需要精确的查询字符串顺序时,启用 Query String Sort 可能导致意外行为。
例如在 WordPress 管理 UI 中,您可能会注意到以下任何行为:
- 媒体库中没有媒体显示
- 无法通过 Appearance > Customize 自定义站点
- 无法在 Appearance > Widgets 中将任何小组件拖到侧边栏
- 无法在 Appearance > Menus 中编辑菜单
要理解原因,请注意 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启用 Query String Sort 后,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[]=...
此类错误表明 Query String Sort 无意中破坏了某些 WordPress 管理页面功能。
排序后,查询进入 Cloudflare 的缓存基础设施(如果资源不在 Cloudflare 缓存中或不可缓存,则也进入源站服务器)。源站服务器然后提供合并的脚本,其顺序不同。由于脚本可能依赖其他脚本,此过程可能破坏依赖关系。
首先分析站点或应用程序围绕查询字符串使用的行为。您是否有以多种可能的查询字符串排列方式提供的资源?
例如,您可能有图片调整大小端点或搜索表单,查询参数的顺序可能不同——如 width、height 和 version——但唯一的参数组合指向单个相关资源。
为减少问题,请考虑:
- 如果您确定此功能对站点任何部分都没有价值,为站点禁用 Query String Sort(查询字符串排序)。Cloudflare 在 Caching(缓存) 应用中默认禁用此选项。
- 使用 Cache Rules 为保留查询字符串参数顺序不重要的 URL 启用 Query String Sort(查询字符串排序)(设置 Cache key(缓存键) > Sort query string(排序查询字符串):
On)。 - 或者,使用 Cache Rules 为需要特定参数顺序的 URL 禁用 Query String Sort(查询字符串排序)。例如,对以
/wp-admin/load-scripts.php开头的 URI 路径或任何具有类似要求的 URL,设置 Cache key(缓存键) > Sort query string(排序查询字符串):Off。
要了解更多关于 Cache Rules 的信息,请访问 Cache Rules。