在 mod_rewrite 重写条件下设置 Apache 环境变量

在 mod_rewrite 重写条件下设置 Apache 环境变量

我的重写规则正在运行,并将 /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>

相关内容