php header expire,解决PHP Expires 导致CDN出现TCP_MISS

因为这个缘故,CDN的 x-Cache总是MISS TCP_MISS,导致要回源。

查了半个小时,终于找到原因了。

749ea44df61021536e9f041d3c097f9b.png

(问题图片)

来自session.c:

Authors: Sascha Schumann

Andrei Zmievski

// ...

CACHE_LIMITER_FUNC(private)

{

ADD_HEADER("Expires: Thu, 19 Nov 1981 08:52:00 GMT");

CACHE_LIMITER(private_no_expire)(TSRMLS_C);

}

见:http://php.net/manual/en/function.session-cache-limiter.php

在session_start() 之前添加session_cache_limiter(’public’)以启用缓存。

如果你用的是框架,我建议放在入口index.php里,以ThinkPHP为例的话是这样:

/**追加部分 **/

header("Content-type:text/html;charset=utf-8");

header("Pragma: public");

header("Expires: ".strtotime("+1 days")." GMT");

session_cache_limiter("public");

/**追加部分 **/

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

error_reporting(E_ALL & ~E_NOTICE);

define('THINK_PATH', '../ThinkPHP/');

define('APP_NAME', 'Home');

define('APP_PATH', '../Application/Home/');

define('__HOME__',__DIR__);

//define('MODE_NAME', 'rest'); // 采用rest模式运行

define('APP_DEBUG', true);//开发环境开启调试模式

define('RUNTIME_ALLINONE', false);

require THINK_PATH.'ThinkPHP.php';

ThinkPHP还要修改配置config.php 增加HTTP_CACHE_CONTROL=public(见ThinkPHP/Lib/Core/View.class.php Line 92 render()方法)。

说个题外话,Pragma: no-cache可以应用到http 1.0 和http 1.1,而Cache-Control: no-cache只能应用于http 1.1.默认是1.0好像,但是CDN才不管你http协议是什么,用2个参数做全等判断的。如果要CDN产生MEM HIT,你可以:

删除header里的Cache-Control和Pragma,或只用一种,取决于你网页头部的协议用的是几

Pragma和Cache-Control的值应该保持一致,否则网页本身可能出问题(表单方面,尤其是用了令牌的表单)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值