用于通过php提供css的php标头

这就是事情。
我正在提供有点压缩的CSS内容</ p>

  str_replace(array(“”,“
”,“\ t”,'\ s \ s +'),'',cssGoesHere)

</ code> </ pre> \ n

通过我页面中的PHP文件:</ p>

&lt; link rel =“stylesheet”type =“text / css”href =“/ css / loader .css.php“/&gt; </ code> </ p>

问题是:如何让浏览器缓存返回的css,但是如果内容发生变化则更新缓存? </ p>

未修改PHP文件,因此附加类似</ p>

 &lt;?php echo filemtime('/ css / loader)。  css.php');  <>  </ pre> 

href </ code>属性不是一个选项。 这可以通过标题来解决,如果是这样,怎么样? 因为AFAIK,如果我像上面所写的那样服务它,浏览器只会缓存结果并继续重用缓存(当然,提供浏览器已启用/能够这样做),但是我需要知道内容是什么时候 改编。</ p>

编辑:我用我的代码创建了一个github项目(虽然我自从我写这篇文章以来我已经做了很多改动)。 这是链接: https://github.com/jurchiks/YACC

如果您有任何链接 建议,写到我的电子邮件或smth。</ p>
</ div>

展开原文

原文

Here's the thing. I'm serving somewhat compressed CSS content

(`str_replace(array("", "
", "\t", '\s\s+'), '', cssGoesHere)`) 

via a PHP file in my page:

<link rel="stylesheet" type="text/css" href="/css/loader.css.php" />

The question is: how do I make the browser cache the css returned, BUT update the cache if the content is changed?

The PHP file is not being modified, so appending something like

<?php echo filemtime('/css/loader.css.php'); ?>

to the href attribute is not an option. Can this be solved with headers, and if so, how? Because AFAIK if I serve it like I wrote above, the browser will just cache the result and keep reusing the cache (provided, of course, the browser is enabled/capable of doing so), but I need it to know when the content is changed.

Edit: I've made a github project with my code (though I did change it alot for more flexibility since I wrote this). Here's the link: https://github.com/jurchiks/YACC
If you have any suggestions, write them to my e-mail or smth.

5个回答



您可以在CSS链接href中添加版本号,并使用mod rewrite将其路由回原始CSS文件。</ p >

例如。 假设您从版本1开始(请注意文件名的版本附录):</ p>

 &lt; link rel =“stylesheet”type =“text / css”href =“  /css/loader-v001.css.php“/&gt; 
</ code> </ pre>

浏览器将缓存此文件。 下次更新CSS文件并且您不希望浏览器使用缓存文件时,只需更改版本号,如下所示:</ p>

 &lt; link rel =“  stylesheet“type =”text / css“href =”/ css / loader-v002.css.php“/&gt; 
</ code> </ pre>

然后,在你的mod重写中, 将 loader -v {x} .css.php </ code>文件的任何请求路由到 loader.css.php </ code>。</ p>

我是 不确定这是否足以满足您的需求,因为它需要手动更改版本号。 但是,不同的文件名将确保浏览器将其视为实际的“新”文件并重新下载。</ p>
</ div>

展开原文

原文

You could add a version number to the CSS link href and use mod rewrite to route it back to the original CSS file.

For example. Let's say you start with version 1 (note the version appendix to the file name):

<link rel="stylesheet" type="text/css" href="/css/loader-v001.css.php" />

The browser will cache this file. The next time you update the CSS file and you don't want the browser to use the cache file, simply change the version number like this:

<link rel="stylesheet" type="text/css" href="/css/loader-v002.css.php" />

Then, in your mod rewrite, route any request for the file loader-v{x}.css.php to loader.css.php.

I am not sure if this is 'automated' enough for your needs, as it does require manual changing of the version number. However, the different file name will ensure the browser sees it as an actual 'new' file and re-downloads it.

doupai1876
doupai1876 哦,绝对。 它当然不是一个全面的解决方案,但值得考虑一下。
8 年多之前 回复
douyi1963
douyi1963 但这绝对需要mod_rewrite或等价物,因此它不是一个好的选择。 虽然这不是一个坏主意。
8 年多之前 回复



在你的css php页面中使用它:</ p>

  header('Content-type  :text / css'); 
header(“Cache-Control:no-cache,must-revalidate”);
</ code> </ pre>

你可以看到更多有关PHP官方文档中标题的信息 </ p>
</ div>

展开原文

原文

use this in your css php page:

header('Content-type: text/css');
header("Cache-Control: no-cache, must-revalidate");

you can see more information about headers in PHP's official documentation

drq1257
drq1257 如何检查Last-Modified是否按预期工作? 我看到日期是正确的,但我怎么知道浏览器是不是每次都下载它? 我在Chrome的网络选项卡中看到我的php文件状态为200但接收时间为0,与状态为304的其他CSS文件相同。它似乎正在工作......
8 年多之前 回复
dongyi7901
dongyi7901 我认为它可以帮助你:标题(“Last-Modified:$ last_modified_time”); 并且无需在客户端编写任何其他代码
8 年多之前 回复
dongsui0929
dongsui0929 不是我感兴趣的东西,因为我希望浏览器缓存CSS文件。 我只想在生成的CSS更改时更新缓存。
8 年多之前 回复
dptgpyl61857413
dptgpyl61857413 好的,请原谅我。
8 年多之前 回复
douqian1517
douqian1517 当我发布该评论时,您没有说明第二行,只说明了Content-type标题。 问题不在于将PHP解释为CSS,因此您的答案是回答未提出的问题。 你现在已经改变了,所以一切都很好。
8 年多之前 回复
drr7731
drr7731 第一行代码是关于iterpret php作为css文件。
8 年多之前 回复
doutan8506
doutan8506 这并没有回答这个问题 - 它是关于控制浏览器何时重新下载页面,而不是将其解释为CSS。
8 年多之前 回复



它可以通过标题缓存控制来解决,但事实证明这不是很有效。 因为某些浏览器会覆盖或修改强制设置。</ p>

我无法看到从何处获取CSS数据,如果是CSS文件,则可以将css文件的filemtime作为 版本指示器或只是提供一个版本字符串,每次CSS文件更改时都必须更改。</ p>

顺便说一下, str_replace(array(“”,“\ n“,”\ t“,'\ s \ s +')</ code>,无法有效删除所有换行符。您应该使用</ p>

  $ foo = nl2br  ($ string,FALSE); 
$ bar = str_replace(array('&lt; br&gt;','\ s \ s +'),'',cssGoesHere)
</ code> </ pre>

代替。</ p>

HTH:)</ p>
</ div>

展开原文

原文

It can be solved by headers cache-control, BUT this have proved to be not very effective. Because some browser do overwrite or modify your forced settings.

I can't see where you getting the CSS data from, if it's a CSS file you could get the filemtime of the css file as version indicator or simply supply somewhere a version string which has to be changed each time the CSS file changes.

By the way, str_replace(array("", " ", "\t", '\s\s+'), does not effectively remove all newlines. Your should use something like

$foo = nl2br($string, FALSE);
$bar = str_replace(array('<br>', '\s\s+'), '', cssGoesHere)

instead.

HTH :)

douna3367
douna3367 感谢关于换行的想法,我在我的代码中使用它:)我也把它放在github上,所以有兴趣的人可以阅读它并可能使用它。
8 年多之前 回复



在您更改时可靠地使文件加载的唯一方法是您声明的方法。 否则,页面将缓存文件并在认为必要时保留该文件。 在没有请求和下载至少标题的情况下,它无法检查页面是否已更改,如果它已经消失那么可能只是下载页面的其余部分,因为带宽将是最小的。</ p>

如果您真的无法将修改后的日期附加到HTML,那么最佳替代方法是通过PHP设置缓存标头。</ p>

   header(“Cache-Control:max-age = time-in-seconds”); 
</ code> </ pre>

这并不总是有效,因为服务器设置和浏览器设置 可以覆盖它,尤其是在激进的缓存浏览器中,例如Internet Explorer。</ p>
</ div>

展开原文

原文

The only way to reliably make the file load upon change is the method you state. Otherwise, the page will cache the file and keep it for as long as it thinks necessary. It can't check to see whether the page has changed or not without requesting and downloading at least the headers, and if it's gone that far it might as well just download the rest of the page, as the bandwidth will be minimal.

The best alternative if you really can't append the modified date to the HTML, would be to set the cache headers via PHP.

header("Cache-Control: max-age=time-in-seconds");

This doesn't always work though, as server settings and browser settings can override this, especially in aggressive caching browsers such as Internet Explorer.



我建议保留生成缓存内容的时间,例如
style.php,其中包含上次修改的CSS数据 在21/06/2012
and缓存内容最后生成于20/06/2012,在strtotime()整数中运行日期比较,您会看到必须从新内容再次生成缓存内容。</ p> \ n </ div>

展开原文

原文

i would suggest to keep somewhere the time that the cache content was generated for example style.php which holds the CSS data was last modified at 21/06/2012 and cache content was last generated at 20/06/2012 running a comparison on dates in strtotime() integers, you see that the cached content must be generated again from the new content.

dongping1689
dongping1689 style.php不是生成的文件,而是generatOR文件。 它实际上并不包含CSS,因此无法从该文件中判断修改时间,您必须检查实际的CSS文件,但这不是这里的想法。
8 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐