让浏览器缓存我的动态PHP样式表

6
我想在一个PHP文件(styles.php)中创建一个样式表,使得样式表可以根据请求的用户动态生成。对于每个单独的用户,样式表是恒定不变的,并且应该缓存在他的客户端浏览器中。
我已经阅读了一些关于设置内容类型和缓存控制等头部的文章,但是我无法让它们起作用。显然这还需要更多的东西,甚至可能不可能实现。浏览器似乎并不总是听从缓存头。
有人知道让PHP文件在浏览器中缓存所需的条件吗?
我不想将所有动态CSS放在HTML的样式块中,也不想为此更改我的Apache配置。如果实现不了我的要求,我也想知道。谢谢!

影响样式表的因素是什么?用户能够配置样式表吗?还是您创建一个随机的样式表? - t.niese
我们的系统有许多模块,并且有一个中心 Web 服务,返回已登录用户的一些样式设置。对于我来说,它们是随机的,但显然它们与某些用户详细信息相关,例如它所属的组。 - myrddin 81
如果您在调用样式脚本时使用了PHP会话,那么这很可能是您的问题所在。我现在无法检查,但如果我记得正确,如果您使用会话,PHP默认会覆盖您的缓存标头。因此,请检查浏览器接收到的样式表标头。 - t.niese
这是我之前没有想到的。谢谢!但我确实检查了浏览器接收到的标头,那些就是我发送的标头。所以,要么浏览器决定忽略它们,要么标头不完整,或者我尝试的东西根本不可能。 - myrddin 81
2个回答

10
这些标题应该可以正常工作:
$expires = 60*60*24; // how long to cache in secs..
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
header('Content-type: text/css');

刚刚在WordPress中使用动态CSS样式表时遇到了完全相同的问题,使用上述方法解决了!谢谢 :) - ss888

0

因为它听起来像他想要根据用户不同来区分样式表,实际上这是一个不同的问题。然后缓存控制应该不是public而是private(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1)。 - t.niese
然而,我已经看过这个页面并尝试了它。不幸的是,浏览器仍在检索php样式表。 - myrddin 81
是的,我试过了。我尝试添加“过期”头部,但没有效果。我在Firefox和Chrome(最新稳定版本)中进行了测试。 - myrddin 81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接