0
############################
# FILES - CACHING: CONTROL #
############################

Header set Cache-Control "max-age=2592000, public"

<FilesMatch "\.(?:bmp|css|cur|gif|ico|jp(?:eg?|g)|js|png|svgz?|tiff?|webp)$">
    Header set Cache-Control "max-age=31536000, public"
</FilesMatch>

<FilesMatch "\.(?:html?|json|php|xml)$">
    Header set Cache-Control "max-age=0, must-revalidate, no-cache, no-store, post-check=0, pre-check=0, private"
</FilesMatch>

<FilesMatch "\.(?:atom|rdf|rss)$">
    Header set Cache-Control "max-age=3600, public"
</FilesMatch>

Header merge Cache-Control "no-transform"

这是htacces我处理Cache-Control标题的片段。默认情况下,对于所有文件,它都设置为max-age=2592000, public. 在底部,我总是试图附加一个no-transform指令,但它根本不起作用。它……好吧,它什么也没做。该no-transform指令从未设置过。我尝试用 替换mergeappend没有任何变化。

现在,这就是我注意到的。如果我将第三个FilesMatch指令替换为:

<FilesMatch "\.(?:atom|rdf|rss)$">
    Header set Cache-Control "max-age=3600, public"
    Header merge Cache-Control "no-transform"
</FilesMatch>

有用。我网站的每个提要文件都有该no-transform指令。如果我将第一个片段的最后一行更改为:

<FilesMatch "^.+$">
    Header merge Cache-Control "no-transform"
</FilesMatch>

嗯......它适用于所有文件。只是……为什么?!

我还注意到另一个关于标题的非常奇怪的行为。假设我想强制保持连接。我将其插入到我的 htaccess 文件中的某处:

Header merge Connection "Keep-Alive"

这就是我在响应头中得到的:

Connection: Keep-Alive, Keep-Alive

再次......为什么?

4

1 回答 1

2

我怀疑(虽然找不到任何文档来支持这一点,因为从这个页面不是 100% 清楚:https : //httpd.apache.org/docs/2.4/sections.html),FilesMatch 指令是在指令之后处理的不在 FileMatch 中。

因此,即使你这样写:

Header set Cache-Control "max-age=2592000, public"

<FilesMatch "\.(?:atom|rdf|rss)$">
    Header set Cache-Control "max-age=3600, public"
</FilesMatch>

Header merge Cache-Control "no-transform"

Apache 像这样处理它:

Header set Cache-Control "max-age=2592000, public"

Header merge Cache-Control "no-transform"

<FilesMatch "\.(?:atom|rdf|rss)$">
    Header set Cache-Control "max-age=3600, public"
</FilesMatch>

这意味着“后”集会覆盖较早的合并。如果您将 FilesMatch 片段中的“设置”更改为“合并”,您应该会看到它可以正常工作,因为它将不再覆盖它。

虽然老实说,我认为这种编写配置的方式很难遵循。既然您要设置缓存控制标头四次,为什么不在四个 set 指令的每一个中同时设置 no-transform 呢?是的,这是一点点重复,但更清晰,意味着您不会遇到这些订单问题!

您的第二个问题更容易从文档中解释:http ://httpd.apache.org/docs/current/mod/mod_headers.html#header :

合并... 双引号中的值被认为与其他相同的未引用值不同

因此,如果值为 Keep-Alive 并且您添加了“Keep-Alive”,那么您最终会得到“Keep-Alive Keep-Alive”。

顺便说一句,您不应该尝试仅通过设置标题来启用 Keep-Alives。虽然这适用于客户端,但 Apache 还需要保持连接活动以供客户端连接,而不仅仅是设置此标头。所以客户端会认为连接保持活动状态,但实际上不会,因为服务器无论如何都会关闭连接。您需要使用如下配置进行设置(这也将为您设置必要的标头):

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
于 2016-01-31T09:26:28.100 回答