.htaccess - 检查 .jpg 大小并在匹配时替换

.htaccess - Check .jpg size and replace if match

我需要控制所有 remotes .jpg 匹配大小:4456 和 4824。如果匹配这些字节,我需要用默认图像替换。如果 .jpg 不存在,下面的代码将替换它。

RewriteCond %{REQUEST_URI} \.(jpeg|JPEG|jpg|JPG)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .*$ /default-image.jpg [L]

我需要,如果 example.com/*.jpg 的大小为 (4456 | 4824),则替换为 default-image.jpg

在 PHP 中,这对我的需要很有帮助,但我更愿意在 .htaccess 中设置。

$link = 'https://example.com/test.jpg';
$check_image = get_headers($link, 1);
$bytes = $check_image["Content-Length"];    
if ($bytes < 5000) { ...

您可以在 Apache 2.4 上使用带有 mod_rewrite 的 Apache 表达式执行以下操作:

RewriteCond %{REQUEST_URI} !^/default-image\.jpg$
RewriteCond expr "filesize(%{REQUEST_FILENAME}) =~ /4456|4824/"
RewriteRule \.jpe?g$ /default-image.jpg [NC,L]

如果请求的图像不存在,那么 filesize() 函数只是 returns 0(没有错误)。因此,要同时处理不存在的图像,您只需更改正则表达式以包含 0,即。 /0|4456|4824/.


旁白:

RewriteCond %{REQUEST_URI} \.(jpeg|JPEG|jpg|JPG)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .*$ /default-image.jpg [L]

在第一种情况下,不需要检查 jpeg|JPEG,因为您在指令中使用了 NC(不区分大小写)标志。但是,最好在 RewriteRule 模式 中执行此检查,而不是创建额外的 条件 .

无需检查请求是否映射到目录(第 3 个 条件 ),除非您的目录名称也以 .jpg 等结尾。 (不太可能)。文件系统检查相对昂贵,因此最好尽可能避免它们。