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 不允许请求标头字段内容类型