Php 如何正确服务CSS

Php 如何正确服务CSS,php,css,caching,header,Php,Css,Caching,Header,假设我出于某种原因希望通过PHP提供CSS(因为预处理、合并等)。我需要在我的PHP中做些什么才能使其正常工作?除了最明显的: header('content-type: text/css; charset=utf-8'); 那么与缓存、修改时间、ETag等相关的头呢?我应该使用哪些,为什么和如何使用?我如何解析传入的头文件并做出适当的响应(例如304未修改) 注意:我知道这可能会很棘手,在将CSS部署为常规CSS文件之前,只做我想用CSS做的事情会容易得多。如果我想那样做,我就不会问这个问

假设我出于某种原因希望通过PHP提供CSS(因为预处理、合并等)。我需要在我的PHP中做些什么才能使其正常工作?除了最明显的:

header('content-type: text/css; charset=utf-8');
那么与缓存、修改时间、ETag等相关的头呢?我应该使用哪些,为什么和如何使用?我如何解析传入的头文件并做出适当的响应(例如304未修改)


注意:我知道这可能会很棘手,在将CSS部署为常规CSS文件之前,只做我想用CSS做的事情会容易得多。如果我想那样做,我就不会问这个问题了。我很好奇如何正确地做到这一点,并想知道。我在使用CSS之前做了什么或可以做什么是无关紧要的;我只想知道如何正确地为它服务:)

注2:我真的很想知道如何正确地执行此操作。我觉得这个问题上的大部分活动都变成了我为自己为什么要这样做而辩护,而不是为如何这样做而得到答案。如果有人能回答我的问题,而不是简单地提出一些类似于粗鲁无礼的建议,我将不胜感激。我相信这是非常棒的,我可能会尝试一下,但这不是我现在要问的。我想知道如何通过PHP为CSS服务,并学习如何正确处理缓存和类似的事情。

我刚刚解释了为什么我认为PHP处理CSS不是一个好主意;我相信大多数实现它的人会更好地使用另一个应用程序结构。看一看

如果必须这样做,则要使缓存工作正常,需要独立跟踪每个变量,并让客户端发送一个唯一标识该变量的参数(因此可以说“未修改”)


内容类型
标题是一个良好的开端,但不是棘手的一点。

一种常见模式是包含一个无意义的GET参数。事实上,stack exchange站点确实做到了这一点:

<link ... href="http://cdn.sstatic.net/stackoverflow/all.css?v=0285b0392b5c">

值得称赞的努力。缓存得到的善意太少了。请欣赏我的短文,试图在路上帮助你

总结 发送
ETag
Last Modified
标题将使浏览器能够在后续请求中向服务器发送
(如果自
以来进行了修改)和
(如果没有匹配的
标题)。然后,如果适用,您可以使用
304未修改
HTTP状态代码和空正文进行响应,即
内容长度:0
。包含
Expires
标题将有助于您在内容确实发生更改的某一天提供新内容

学徒 听起来很简单,但要做到恰到好处可能有点棘手。幸运的是,我们所有人都有

一旦你启动并运行起来,请转向,以帮助你平滑任何粗糙的角落,你可能已经离开

专家 对于
ETag
的值,您希望有一些可以复制的内容,但在内容发生变化时仍然会更改。否则,您将无法判断传入值是否匹配。当内容发生变化时仍会发生变化的可再现值的一个很好的候选值是通过缓存提供的文件的
mtime
的MD5散列。在您的情况下,它可能是合并的所有文件的总和

对于上次修改的
而言,逻辑答案是所提供文件的实际
mtime
。为什么忽视显而易见的东西。或者,对于一组文件,如您的情况,使用组中最新的
mtime

对于
Expires
,只需为资产选择适当的
TTL
,或生存时间。将此数字添加到资产的
mtime
,或您为上次修改的
选择的值,您就有了答案

您可能还希望包含
缓存控制
头,让途中可能的代理知道如何正确地为其客户机服务

学者 有关您的问题的更具体回答,请参考您之前的问题:


您必须在javascript文件的末尾添加查询字符串,这是一个很好的选择,可以说它是新文件,直到浏览器认为是相同的css文件

www.example.com/css/tooltip.css?version1.0  


因此,浏览器将理解重新加载的新文件,将其保存在缓存中,直到下一版本,并且如果您在查询字符串末尾使用php附加自动日期,则易于维护。

通过php提供CSS(或JavaScript)的最简单方法是使用,一个非常有用的PHP资产管理器,类似于Django的contrib.staticfiles或Ruby的Jammit。它处理缓存和缓存失效、动态缩小、压缩以及其他答案中提到的所有“棘手的部分”


为了理解如何正确编写自己的资产服务器,我强烈建议您阅读Assetic的源代码。它的评论性和可读性都很强,您将学到很多关于缓存、缩小以及Assetic做得很好的所有其他方面的最佳实践。

完全知道这不是棘手的一点,这就是为什么我问:)您所说的“跟踪每种变体”是什么意思?什么的变种?我现在想做的就是合并几个CSS文件,并可能将它们缩小为一个。登录用户之间没有差异,或者类似的情况。每个人都有一个CSS。@ sVIH如果你只是使用PHP来组合文件和缩小,那么你应该提前考虑,而不是动态地为每一个请求。您的web服务器会感谢您的。@RichBradshaw请给Stylus一根针。我以前也用过SASS。@如果禁用Javascript,Borealid会不会让我的网站看起来很糟糕?@Svish你有没有试过在禁用Javascript的情况下浏览网页?大多数网站都被破坏了。无论如何,如果你想让你的样式在没有JS的情况下工作,你可以选择服务器端编译路线
www.example.com/css/tooltip.css?version1.0  
www.example.com/css/tooltip.css?12-01-2012