【发布时间】:2021-01-20 09:05:21
【问题描述】:
我正在使用 php 动态生成 css 文件。因此我的 HTML 包含代码:
<link rel="stylesheet" href="/ap.css.php">
因为它是 PHP,浏览器(正确)不会缓存它。但是,这会导致后续页面访问的不必要开销,因为所有页面都使用相同的结果 CSS(尽管对于不同的用户可能会有所不同)。
我想我可能只在出现 404 错误时生成一个常规 CSS 文件。我假设客户端会缓存它。 IOW 我输入了 HTML:
<link rel="stylesheet" href="/ap.css">
...然后我写了一个 404 脚本,它会巧妙地间接调用 /ap.css.php。
我的意图是客户端将因此只请求一次并将缓存的结果用于所有后续页面访问,从而减少页面负载和数据使用(尤其是手机)。
现在我可以在地址栏上输入 ap.css 文件名,果然,404 处理程序提供了所需的 CSS 输出,但是当使用 HTML 中的链接时,它仍然会因 404 而中止。
...所以我尝试放入一个特殊的 text/css 标题。唉,按照标题给出错误消息没有任何区别。
<?php
header_remove(); // try to remove any file not found header that might have been queued
header('Content-Type: text/css');
?>
有什么方法可以禁用此 404 中止,还是我必须选择为每个页面访问一遍又一遍地生成 CSS 或使其成为每个人的相同常规静态 CSS 文件?
【问题讨论】:
-
您不应为此滥用 404 处理程序,而应专门针对该特定 URL 使用适当的 URL 重写。
-
header_remove不会在这里做你想做的事,如果你想继续使用 404 处理程序方法,那么使用header明确设置你自己的 200 OK 状态代码。跨度> -
而且仅供参考,默认情况下 PHP 没有设置任何适当的缓存标头,因此当浏览器请求您的 CSS 第二次时间时,您的 CSS 最多会在此处正确缓存,因为随后 Web 服务器再次接管并传递静态文件,因此有关缓存指令的 Web 服务器配置变为活动状态。如果您希望从 first 请求中直接对其进行缓存,那么您的 PHP 脚本也需要使用适当的缓存标头进行响应。
-
这些是 3 个非常有用的答案我在标题中添加了 OK 状态代码,网络 ERR_ABORT 立即消失并开始工作,但仍未缓存 css。
-
然后我添加了缓存控制标头,但它仍然没有缓存。我会玩一下。对于第一个答案。它主要是关于最大限度地减少使用手机的网站访问者的数据使用量,但它也让我可以选择实际创建自定义的 ap.css 文件,或者在没有文件时让它生成默认值。我的包含脚本位于 HTTP 根目录之外的单独目录树中(非常安全),因此在使用相同 php 引擎的多个站点中也很常见。它为所有人提供了默认配置。
标签: php css file-not-found