【问题标题】:htaccess: cache all images but exclude caching images from subfolderhtaccess:缓存所有图像,但从子文件夹中排除缓存图像
【发布时间】:2021-11-20 06:55:46
【问题描述】:

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

所以上面有图片:

/(基本目录)
/IMG/
/IMG/文件夹/
IMG/大/

所以所有图像都需要缓存,但我想让它不缓存 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

【问题讨论】:

  • 您在/IMG/BIG/ 中还有其他需要缓存的内容吗?当您说“不起作用”时,我假设您收到 500 Internal Server Error 响应?

标签: apache .htaccess mod-expires


【解决方案1】:
ExpiresByType image/jpg "access plus 1 month"

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

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

&lt;IfModule&gt; 包装器不是必需的,除非您打算在未启用 mod_expires 和/或 mod_headers 的多个服务器上使用相同的配置(不太可能)。

要定位除/IMG/BIG 子目录之外的所有其他内容,您可以使用&lt;If&gt; 表达式并使用否定的正则表达式(!~ 运算符)检查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/ 的请求的任何标头,那么您可以添加一个&lt;Else&gt; 指令:

<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/ 目录中有您可能想要缓存的其他文件类型,否则您可以删除&lt;FilesMatch&gt; 容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2021-08-17
    • 2017-09-18
    相关资源
    最近更新 更多