Apache 2.2 响应的条件标头

Posted

技术标签:

【中文标题】Apache 2.2 响应的条件标头【英文标题】:Apache 2.2 conditional headers on response 【发布时间】:2014-09-06 06:28:56 【问题描述】:

我正在尝试将 apache 配置为在响应时发送过期和缓存控制标头,但前提是我在请求中收到一些特定的查询字符串。

为此,我尝试如下配置服务器:

RewriteCond %QUERY_STRING ^.*whateverIWantInMyQueryString.*$ 
RewriteRule ^(.*)$ - [env=CACHE_HEADERS:1] 

<FilesMatch "\.(js|css|png|gif|GIF)$">
   <IfDefine CACHE_HEADERS>
      ExpiresActive On
      ExpiresDefault "access plus 12 hours"
      Header append Cache-Control "public"
   </IfDefine>
</FilesMatch>

但这似乎不起作用。

如果我更改配置如下:

....
<IfDefine !CACHE_HEADERS>
....

它确实有效,因此 IfDefine 似乎无法检查是否设置了 CACHE_HEADERS 环境变量。

我还尝试使用 Header 指令和基于相同环境变量的条件来配置内容,如下所示:

RewriteCond %QUERY_STRING ^.*whateverIWantInMyQueryString.*$ 
RewriteRule ^(.*)$ - [env=CACHE_HEADERS:1] 
<FilesMatch "\.(js|css|png|gif|GIF)$">
   Header always set Cache-Control "max-age=3600, public" env=CACHE_HEADERS
   Header always set Expires "Thu, 01 Jan 2015 00:00:00 GMT" env=CACHE_HEADERS
</FilesMatch>
.....

但这也不起作用。所以我假设这可能是因为 mod_rewrite 设置的环境变量,由于某种原因,IfDefine 指令和 Header 指令都没有检测到。

有谁知道这可能是什么原因或为什么这根本不起作用?

【问题讨论】:

【参考方案1】:

IfDefined 不起作用的原因可以在这里找到:Apache IfDefine conditionals in .htaccess

基本上,如果您像使用 SetEnv 或 SetEnvIf 一样定义变量,则 IfDefined 仅评估在命令行中定义的变量而不是

但据我所知 env= 应该可以工作。

【讨论】:

以上是关于Apache 2.2 响应的条件标头的主要内容,如果未能解决你的问题,请参考以下文章

Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头

如何使用 Apache 将 cookie 值附加到响应位置标头的末尾?

如何在 AWS 负载均衡器响应中禁用 Apache HTTP 标头信息?

Apache HttpClient 未显示响应的 Content-Length 和 Content-Encoding 标头

无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

React.js + PHP/Apache:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段内容类型