如何在Apache conf中仅为现有文件设置HTTP标头

时间:2011-10-21 00:33:17

标签: caching header apache

我使用Apache提供文件和应用请求,应用请求使用RewriteRule将与模式匹配的网址发送到我的应用服务器。

我希望仅针对与上述RewriteConds不匹配的请求设置特定的HTTP标头(缓存控制)。有没有办法在不使用.htaccess文件的情况下这样做?

我尝试在Header set(使用L标志)之后放置RewriteRule指令,但标题仍然会被应用。

1 个答案:

答案 0 :(得分:1)

你应该发布你的rewriteRules。

我们当然可以做些什么。我想的第一件事是在匹配rewriteRules中设置一个环境变量(所以一组rewriteCond,反转之前的那些),使用[E=myvar:myvalue]标签;并使用Header指令[env=myvar]的最后一个可用参数来条件设置此标题。

然后你说:

  

有没有办法在不使用.htaccess文件的情况下这样做?

嗯,RewriteRules和.htaccess文件松散相关。您在.htaccess中设置的任何内容都非常适合在<Directory>指令中使用虚拟主机上的AllowOverride None以防止来自apache的IO操作,尝试读取一堆.htaccess文件每个请求。

第二件事,你说:

  

我尝试在RewriteRule之后放置Header set指令   (使用L标志)

那么[L]标志会阻止同一个目录上的几个RewriteRules一个接一个地应用,所以它们现在不会被链接到direclty。但事实上,在你的rewriteRule结束后([L]),然后在目录上重新应用rewriteRule的输出,看看是否还应该应用任何RewriteRule(可能是同一个)。

这就是我们有时会看到太多内部重定向消息的原因。

看到它发生的唯一方法是在VirtualHost上使用RewriteLog /a/file.logRewriteLogLevel 9(有时很多惊喜,有些规则有时会进行太多的递归)。

一个很好的RewriteCond就是:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

任何以此rewriteCond为前缀的规则将仅在您第一次进入目录时应用,在规则结束后(可能带有[L]或因为没有更多规则),结果将在direcory规则,但env变量REDIRECT_STATUS不为空。如果设置了这个env变量,则此条件告诉mod-rewrite以避免该规则。