开启 304 Not Modified Header,提高wordpress网站效率

XiaoD
XiaoD
XiaoD
122
文章
0
评论
2017年10月5日21:37:44 评论 152 2354字阅读7分50秒

什么304NotModifiedHeader

客户端(一般是浏览器)发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回304NotModified这个状态码。

比如客户端(浏览器)在请求一个文件的时候,发现自己缓存的文件有LastModified,那么在请求中会包含IfModifiedSince,这个时间就是缓存文件的LastModified。因此,如果请求中包含IfModifiedSince,就说明已经有缓存在客户端,只要判断这个时间和当前请求的文件的修改时间就可以确定是返回304还是200。

WordPress中如何开启304NotModifiedHeader

WordPress作为一个CMS系统,如果每天更新的内容不多,对于未登录的用户来说,每次访问同一个页面,如果浏览器中已经有缓存,其实服务器无需再次生成一次页面,直接返回304NotModifiedHeader,让用户直接查看浏览器中缓存即可。

那么在WordPress中如何给未登录用户开启304NotModifiedHeader呢?可以在当前主题的functions.php函数加入以下代码:

/*
Plugin Name: WPJAM 304 Header
Description: WordPress 中开启 304 Not Modified Header,提高网站效率
Version: 0.1
Author: Denis
*/

add_filter('wp_headers','wpjam_headers',10,2);
function wpjam_headers($headers,$wp){
if(!is_user_logged_in() && empty($wp->query_vars['feed'])){
$headers['Cache-Control']   = 'max-age:600';
$headers['Expires']         = gmdate('D, d M Y H:i:s', time()+600) . " GMT";

$wpjam_timestamp = get_lastpostmodified('GMT')>get_lastcommentmodified('GMT')?get_lastpostmodified('GMT'):get_lastcommentmodified('GMT');
$wp_last_modified = mysql2date('D, d M Y H:i:s', $wpjam_timestamp, 0).' GMT';
$wp_etag = '"' . md5($wp_last_modified) . '"';
$headers['Last-Modified'] = $wp_last_modified;
$headers['ETag'] = $wp_etag;

// Support for Conditional GET
if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
$client_etag = stripslashes(stripslashes($_SERVER['HTTP_IF_NONE_MATCH']));
else $client_etag = false;

$client_last_modified = empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? '' :trim($_SERVER['HTTP_IF_MODIFIED_SINCE']);
// If string is empty, return 0. If not, attempt to parse into a timestamp
$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;

// Make a timestamp for our most recent modification...
$wp_modified_timestamp = strtotime($wp_last_modified);

$exit_required = false;

if ( ($client_last_modified && $client_etag) ?
(($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) :
(($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) {
$status = 304;
$exit_required = true;
}

if ( $exit_required ){
if ( ! empty( $status ) ){
status_header( $status );
}
foreach( (array) $headers as $name => $field_value ){
@header("{$name}: {$field_value}");
}

if ( isset( $headers['Last-Modified'] ) && empty( $headers['Last-Modified'] ) && function_exists( 'header_remove' ) ){
@header_remove( 'Last-Modified' );
}

exit();
}
}
return $headers;
}

开启304状态,相应会带来一些问题,比如用户更新留言了,其他用户可能会看不到,当然如果你要你用多说,那就不存在这个问题,还有Postview会有一些统计不再计入等各种问题,你可以根据自己的需求开启。

继续阅读
XiaoD
  • 本文由 发表于 2017年10月5日21:37:44
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接。
让你的wordpress文章部分内容登陆后可见 Wordpress

让你的wordpress文章部分内容登陆后可见

采取诱导注册的方法来留住访客是常见的网站运营方法,因此如何诱导访客注册就是一个关键性的难题了。相信大家在很多网站可以看到,网站发布了一些比较优秀而且不常见的资源后,强制访客只有注册并登陆后才能阅读文章...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: