我的重写规则正在运行,并将 /versioned/1234/images/foo.gif 之类的请求重定向到 /images/foo.gif,但它似乎没有设置 set_expires_header 环境变量,因为未附加标头。如果我取消注释明确设置环境变量的行,则会设置标头。我做错了什么?有没有更好的方法?我希望能够使用两个 URL 访问文件,但只有在通过版本化 URL 访问时才会添加标头。
<VirtualHost *:80>
ServerName dev.example.com
DocumentRoot /var/www/html/dev
<Directory "/var/www/html/dev">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
SetEnvIf Request_URI versioned set_expires_header
RewriteEngine on
RewriteRule ^versioned/[^/\.]+/(.*)$ /$1 [E=set_expires_header:true,L]
#SetEnv set_expires_header true
Header append Expires "access plus 1 year" env=set_expires_header
Header append Cache-Control "public" env=set_expires_header
</Directory>
</VirtualHost>
答案1
上述配置不起作用的原因是这些Header
行在之前被评估RewriteRule
,因此环境变量始终为空。
解决方案是将块移到RewriteRule
外部<Directory>
,以便在行之前对其进行评估Header
。
看快速提供 JavaScript更多细节
以下是最终的工作配置:
<VirtualHost *:80>
ServerName dev.example.com
DocumentRoot /var/www/html/dev
RewriteEngine on
RewriteRule ^versioned/[^/\.]+/(.*)$ /$1 [E=set_expires_header:true,L]
<Directory "/var/www/html/dev">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Header append Expires "Mon, 28 Jul 2014 23:30:00 GMT" env=set_expires_header
Header append Cache-Control "public" env=set_expires_header
</Directory>
</VirtualHost>