diff --git a/index-redis-page-cache.php b/index-redis-page-cache.php index db35c7ce8d6d6a5e14a85e0a6fbbf689be3f383d..4aa02cf4427cd6c88a5214e0ac38e68e6aacf6d6 100644 --- a/index-redis-page-cache.php +++ b/index-redis-page-cache.php @@ -29,17 +29,18 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA global $redis_page_cache_config; $redis_page_cache_config = array( - 'debug' => false, - 'debug_messages' => '', - 'stats' => false, - 'cached' => false, - 'server_ip' => '127.0.0.1', - 'redis_server' => '127.0.0.1', - 'redis_port' => 6379, - 'redis_db' => 0, - 'cache_version' => 1, - 'cache_headers' => true, - 'secret_string' => 'changeme', + 'debug' => false, + 'debug_messages' => '', + 'stats' => false, + 'cached' => false, + 'server_ip' => '127.0.0.1', + 'redis_server' => '127.0.0.1', + 'redis_port' => 6379, + 'redis_db' => 0, + 'cache_version' => 0, + 'cache_headers' => true, + 'additional_headers' => array( 'link', 'x-hacker', 'x-pingback' ), + 'secret_string' => 'changeme', ); // Uncomment either option below to fix the values here and disable the admin UI @@ -275,6 +276,9 @@ if ( ! defined( 'WP_USE_THEMES' ) ) { define( 'WP_USE_THEMES', true ); } +// Set a header advertising the cache engine +header( 'X-Redis-Page-Cache: Redis Page Cache for WordPress by Erick Hitter (http://eth.pw/rpc)', true ); + try { // Establish connection with Redis server $redis = redis_page_cache_connect_redis(); @@ -311,6 +315,13 @@ try { // Retrieve cached page, which is an array that includes meta data along with the page output $cache = unserialize( $redis->get( $redis_page_cache_config['redis_key'] ) ); + // Output cached headers from original page + if ( ! empty( $cache['headers'] ) ) { + foreach ( $cache['headers'] as $key => $value ) { + header( "{$key}: {$value}", true ); + } + } + // Output cache headers if desired if ( $redis_page_cache_config['cache_headers'] ) { header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $cache['time'] ) . ' GMT', true ); @@ -360,12 +371,37 @@ try { // Cache rendered page if appropriate if ( ! is_404() && ! is_search() ) { + // Default cache payload $cache = array( - 'output' => $output, - 'time' => time(), - 'age' => 31536000, // one year in seconds + 'output' => $output, + 'time' => time(), + 'age' => 31536000, // one year in seconds + 'headers' => array(), ); + // Capture certain headers + // Props to @andy and Batcache (http://wordpress.org/plugins/batcache/) for this code + if ( ! empty( $redis_page_cache_config['additional_headers' ] ) ) { + if ( function_exists( 'headers_list' ) ) { + foreach ( headers_list() as $header ) { + list( $key, $value ) = array_map( 'trim', explode( ':', $header, 2 ) ); + $cache['headers'][ $key ] = $value; + } + } elseif ( function_exists( 'apache_response_headers' ) ) { + $cache['headers'] = apache_response_headers(); + } + + if ( $cache['headers'] ) { + foreach ( $cache['headers'] as $key => $value ) { + if ( ! in_array( strtolower( $key ), $redis_page_cache_config['additional_headers' ] ) ) + unset( $cache['headers'][$key] ); + } + } + + unset( $key ); + unset( $value ); + } + // Is unlimited cache life requested? if ( ! isset( $redis_page_cache_config['unlimited'] ) ) { $redis_page_cache_config['unlimited'] = (bool) get_option( 'redis-page-cache-debug', false );