htaccess "try" 不同的扩展名可以吗?

Can htaccess "try" different extensions?

我有一个文件夹,其中包含用户上传的几种不同格式的图片。这些文件通过我的上传脚本使用唯一 ID 进行编号。

当通过 php 显示它们时,我希望能够 link 在不知道(或必须保存在数据库中)它们的扩展名(即 images/42images/69 而不是 images/42.pngimages/69.jpeg。我一直在做一些研究,但无法真正想出一种方法来正确地写我的 .htaccess。我做了什么far 不起作用,我也没有成功地尝试提出我的重写条件。有什么建议吗?

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

我找到了这个但不能真正适应我的问题:https://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_s

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

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

例如,在根 .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}/[=10=].webp -f
RewriteRule ^images/\d+$ [=10=].webp [T=image/webp,L]

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

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

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

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

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


images uploaded by users in a few different formats.

另一种方法是在上传过程中将图像转换为特定格式。因此,您 总是 重写为 .png (例如)——这将提高性能。这具有额外的“安全”优势,即 恶意 文件(“假装”为图像的脚本)将被拒绝,因为图像转换可能会失败。


多视图(备选)

或者,您可以简单地启用多视图并让 mod_negotiation 完成工作。 mod_negotiation 然后检查 return 适当 mime-type 的各种文件扩展名,并将 return 匹配的资源。

例如:

Options +MultiViews

不需要 mod_rewrite 指令。

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


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

你不能像这样在一条规则中做到这一点。该指令还匹配 everything(即 ^(.*)/?$)——它自然包括每个未映射到图像的 URL。 substitution 字符串是普通字符串,不是正则表达式,因此像 (png|jpg|jpeg|gif) 这样的结构被视为文字文本。 QSA 标志在这里无关紧要。无论如何默认都会附加查询字符串,但是您的图像 URLs 有一个查询字符串开头吗?