htaccess:缓存所有图像,但排除子文件夹中的缓存图像

htaccess: cache all images but exclude caching images from subfolder

我想将所有图像缓存 1 个月,效果很好,但问题是当我尝试从缓存中排除子目录时。

所以有图片:

/ (base dir)
/IMG/
/IMG/folder/
IMG/BIG/

因此所有图像都需要缓存,但我想让它不缓存 IMG/BIG/ 文件夹

上的图像
<IfModule mod_expires.c>  
  ExpiresActive on

  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpg "access plus 1 month"
</IfModule>  

上面的代码有效但是当

我尝试使用此代码排除 /IMG/BIG 然后它不起作用

<Directory "/IMG/BIG">

<FilesMatch "\.(jpg|png)$">
    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>
    <IfModule mod_headers.c>
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires 0
    </IfModule>
</FilesMatch>
</Directory>

我想在根文件夹中的 .htaccess 中解决这个问题,而不是通过在 /IMG/big 文件夹中添加另一个 .htaccess

ExpiresByType image/jpg "access plus 1 month"

旁白: JPEG 文件的正确 mime-type 是 image/jpeg,而不是 image/jpg,所以上面可能没有做任何事情.

.htaccess 中不允许使用 <Directory> 指令 - 这应该会导致 500 内部服务器错误(详细信息将在您服务器的错误日志中)。

不需要 <IfModule> 包装器,除非您打算在未启用 mod_expires and/or mod_headers 的多个服务器上使用相同的配置(不太可能)。

要定位除 /IMG/BIG 子目录之外的所有其他内容,您可以使用 <If> 表达式并使用取反的正则表达式(!~ 运算符检查 REQUEST_URI 服务器变量).例如:

<If "%{REQUEST_URI} !~ m#^/IMG/BIG/#">
  ExpiresActive on
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
</If>

要专门覆盖 /IMG/BIG/ 请求的任何 headers,您可以添加一个 <Else> 指令:

<Else>
    <FilesMatch "\.(jpg|png)$">
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires 0
    </FilesMatch>
</Else>

除非 /IMG/BIG/ 目录中有其他文件类型需要缓存,否则您可以删除 <FilesMatch> 容器。