首页 > 解决方案 > htaccess 可以“尝试”不同的扩展吗?

问题描述

我有一个文件夹,其中包含用户以几种不同格式上传的图像。这些文件由我的上传脚本用唯一 ID 编号。

当通过 php 显示它们时,我希望能够在不知道(或必须保存在数据库中)它们的扩展名(即images/42images/69而不是images/42.png, .)的情况下链接到它们images/69.jpeg。我一直在做一些研究,但不能真正想出一个正确写我的方法.htaccess。到目前为止我所做的一切都行不通,我试图提出我的重写条件也没有成功。有什么建议吗?

RewriteRule ^(.*)/?$    $1.(png|jpg|jpeg|gif)    [QSA,L]

我发现了这一点,但不能真正适应我的问题:https ://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_s

标签: apache.htaccessmod-rewrite

解决方案


是的,您可以依次手动尝试每个扩展。每个扩展都需要不同的规则。第一个匹配的扩展将“获胜”。如果扩展匹配,则强制使用相应的 mime 类型。

我假设您的图片 URL 的格式为/images/<number>. 这需要具体,否则我们将不必要地测试错误的 URL。

例如,在根.htaccess文件顶部附近:

# Check for ".webp" file (and check browser support)
# NB: If webp not supported then there needs to be a fallback (.png or .jpg)
RewriteCond %{HTTP_ACCEPT} (?:^|,)image/webp(?:,|$)
RewriteCond %{DOCUMENT_ROOT}/$0.webp -f
RewriteRule ^images/\d+$ $0.webp [T=image/webp,L]

# Check for ".png" file
RewriteCond %{DOCUMENT_ROOT}/$0.png -f
RewriteRule ^images/\d+$ $0.png [T=image/png,L]

# Check for ".jpg" file
RewriteCond %{DOCUMENT_ROOT}/$0.jpg -f
RewriteRule ^images/\d+$ $0.jpg [T=image/jpeg,L]

# Check for ".jpeg" file
RewriteCond %{DOCUMENT_ROOT}/$0.jpeg -f
RewriteRule ^images/\d+$ $0.jpeg [T=image/jpeg,L]

# Check for ".gif" file
RewriteCond %{DOCUMENT_ROOT}/$0.gif -f
RewriteRule ^images/\d+$ $0.gif [T=image/gif,L]

$0反向引用包含匹配的整个 URL 路径,例如。image/42. 在内部将请求重写到该文件之前,每个RewriteCond指令都会检查具有相应文件扩展名的文件是否存在。该T标志确保Content-Type与响应一起发送正确的标头。


用户以几种不同格式上传的图像。

另一种方法是将图像转换为特定格式作为上传过程的一部分。所以你总是重写.png(例如) - 这将更有效率。这具有额外的“安全”优势,恶意文件(“伪装”为图像的脚本)将被拒绝,因为图像转换可能会失败。


多视图(替代)

或者,您可以简单地启用 MultiViews 并让 mod_negotiation 完成工作。mod_negotiation 然后检查返回适当的 mime 类型的各种文件扩展名,并将返回匹配的资源。

例如:

Options +MultiViews

不需要 mod_rewrite 指令。

但是,除非您在服务器配置中手动创建类型映射,否则您对此没有太多控制权,如果您有其他 mod_rewrite 指令,这可能会发生冲突并导致问题。除非您将其限制在某些路径,否则 MultiViews 将适用于所有内容。


RewriteRule ^(.*)/?$    $1.(png|jpg|jpeg|gif)    [QSA,L]

你不能在这样的单一规则中做到这一点。该指令还匹配所有内容(即。^(.*)/?$) - 自然包括不映射到图像的每个 URL。替换字符串是普通字符串,而不是正则表达式,因此类似的构造被(png|jpg|jpeg|gif)视为文字文本。国旗在QSA这里无关紧要。无论如何,默认情况下都会附加查询字符串,但是您的图像 URL 是否以查询字符串开头?


推荐阅读