我使用Apache提供文件和应用请求,应用请求使用RewriteRule
将与模式匹配的网址发送到我的应用服务器。
我希望仅针对与上述RewriteConds
不匹配的请求设置特定的HTTP标头(缓存控制)。有没有办法在不使用.htaccess
文件的情况下这样做?
我尝试在Header set
(使用L标志)之后放置RewriteRule
指令,但标题仍然会被应用。
答案 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.log
和RewriteLogLevel 9
(有时很多惊喜,有些规则有时会进行太多的递归)。
一个很好的RewriteCond就是:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
任何以此rewriteCond为前缀的规则将仅在您第一次进入目录时应用,在规则结束后(可能带有[L]或因为没有更多规则),结果将在direcory规则,但env变量REDIRECT_STATUS不为空。如果设置了这个env变量,则此条件告诉mod-rewrite以避免该规则。