WordPress.org

Make WordPress Core

Opened 8 months ago

Last modified 3 months ago

#25072 new defect (bug)

Send no-cache response header from wp-cron.php requests

Reported by: westonruter Owned by:
Milestone: Awaiting Review Priority: normal
Severity: normal Version: 2.1
Component: Cron API Keywords: has-patch
Focuses: Cc:

Description

In high-scale WordPress installs, it is common to enable DISABLE_WP_CRON and then have a system cron ping wp-cron.php?doing_wp_cron every minute. When working on a site with DISABLE_WP_CRON, we recently ran into a situation where future-published posts were consistently missing their schedule for several minutes. It turns out that the network architecture routed requests through Pound and then Varnish before hitting the web server, including requests originating on the server itself.

Because of the default proxy cache configuration, the requests to wp-cron.php were getting served from the cache without hitting WordPress, so the scheduled tasks were not getting executed. A workaround was put in place to add a timestamp cache-buster (i.e. wp-cron.php?doing_wp_cron&1283712312), and then we worked out a more elegant solution with a mu-plugin which did nocache_headers() if DOING_CRON. It seems the best solution is to just always send no-cache headers from wp-cron.php itself, as I can't imagine a situation where responses should be cached (except maybe with a max-age=60).

In addition to the default no-cache headers that WordPress sends, we also included a Surrogate-Control: no-cache header for caching proxies to specifically target.

So to summarize: I propose that wp-cron.php send no-cache response headers.

Attachments (2)

wp-cron.php.diff (788 bytes) - added by westonruter 8 months ago.
Patch to wp-cron.php to do nocache_headers()
no-cache-wp-cron.php (552 bytes) - added by westonruter 8 months ago.
mu-plugin to send no-cache response headers from wp-cron.php

Download all attachments as: .zip

Change History (8)

westonruter8 months ago

Patch to wp-cron.php to do nocache_headers()

comment:1 westonruter8 months ago

Come to think of it, the DISABLE_WP_CRON may be inconsequential here: the normal asynchronous wp-cron.php loopback requests would also likely be subject to the proxy caching.

westonruter8 months ago

mu-plugin to send no-cache response headers from wp-cron.php

comment:2 westonruter8 months ago

  • Cc weston@… added

comment:3 c3mdigital8 months ago

  • Severity changed from minor to normal
  • Version changed from trunk to 2.1

comment:4 tollmanz8 months ago

  • Cc tollmanz@… added

comment:5 mordauk3 months ago

I don't know of any reason this would cause issues. Seems like a good idea to me.

comment:6 nacin3 months ago

What if you just used a POST request instead?

Note: See TracTickets for help on using tickets.