在 oneboxes 中下载 .webp 图片的功能已失效

看起来在一键框中下载图片的功能已损坏。这可能是由于一键框或安全媒体最近的变化导致的回归问题。@vinothkannans 能否请您查看一下?

示例:一键框 https://www.samsung.com/us/mobile/galaxy-z-flip 未显示图片,因为图片是通过 HTTP 加载的。

12 个赞

问题在于从 URL “http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg” 下载 onebox 图片时,返回的文件格式为 “.webp”(samsung-logo-191-1.webp)。因此我们无法下载该文件,因为 “.webp” 格式未在我们 authorized_extensions 站点设置中列入白名单。

由于 favicon 是 “.ico” 文件,因此未被下载。我们是否应在 onebox 中默认允许 “ico” 文件?

5 个赞

我在想,WebP 是否只是因为使用了 Chrome 用户代理才出现的 :thinking:

我不这么认为。即使我在 Firefox 中手动下载,它返回的仍然是 webp 文件。

3 个赞

在我的 Firefox 版本(MacOS 上的 77.0.1 (64 位))中,上述 URL 请求的 Accept 头为:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

(即,浏览器请求如果可用则返回 image/webp 格式)

而 Safari 的 Accept 头为:

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

三星 Web 服务器返回的是 JPEG 格式。Onebox 在 Safari 中显示正确(包含图片)。

5 个赞

三星正在使用 Akamai Image Manager 来提供这些文件。

如果我传递一个 Accept 头为 image/jpeg,image/gif,它确实会返回 image/jpeg,符合预期。

wget --header="Accept: image/jpeg,image/gif" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 11:43:58--  http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.6’

Discourse 尝试通过调用 FileHelper.download 来获取图像,该函数会调用 FinalDestination.get,最终使用以下 UserAgent 请求文件:

Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

因此,如果我们使用与上述相同的 Accept 头请求同一张图像,并添加该用户代理,结果如下:

wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 11:52:50--  http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45540 (44K) [image/webp]
Saving to: ‘samsung-logo-191-1.jpg.10’

返回的是 image/webp。看起来他们忽略了 Accept 头,而是根据用户代理使用自己的逻辑来确定最佳文件类型。

苹果历史上并不支持 WebP,因此让我们试试:

wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 12:27:02--  http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.16’

成功了!

我认为可以有力地论证,Web 服务器应始终尊重 Accept 头,而不要试图“超越”它。另一方面,也有人可能会争辩说,如果你提供了特定的用户代理字符串,就应该准备好表现得像该用户代理(尽管用户代理伪装并不罕见,且有多种用途)。

事实上,苹果已在最近发布的 iOS 14 和昨天发布的 macOS Big Sur 中 添加了对 WebP 的支持,因此我们可能应该支持它(将其添加为默认允许的扩展名),并配置 ImageMagick 以支持它(这将引入对 libwebp 或类似库的依赖),以便我们能够对其进行优化和调整大小等操作。

7 个赞

Akami 的这种行为太糟糕了,天哪。

随意更改我们的伪装 User-Agent 是否很简单?无论如何,我们都不应该伪装成 2017 年发布的 Chrome 58。

@evitrout 应该完全了解 Discourse 为何要伪装,以及为何不使用专为 Discourse 设计的特殊 User-Agent。我模糊的记忆是,如果我们不伪装,有些人会拒绝我们下载图片和 onebox。我们可以:

  1. 检查情况是否已发生变化,然后尝试使用我们自己的 User-Agent。
  2. 将我们的伪装 User-Agent 升级到最新版的 Chrome。
  3. 切换到 macOS 上不支持 WebP 的 Safari 版本。

此外,我们或许可以在文件下载后允许进行“透明”的 WebP 到 JPEG 转换,这样即使网站运营方不完全支持,我们仍然可以代理不兼容的图片。(这对于其他一些生僻的图片格式也可能很有用)

或者,我们干脆继续前进,默认支持 WebP,并将其添加到所有默认设置中?(我想知道现在是否还为时过早)

3 个赞

不幸的是,许多网站除非请求看起来来自浏览器,否则不会提供正确的内容。我怀疑,如果我们更改这一点,大多数来源会正常工作,但有一两个可能会出现异常。

一框(Onebox)往往是一场“打地鼠”游戏:修复了一个问题,另一个问题又会在别处冒出来。

4 个赞

既然苹果已经妥协,在 Safari 和 iOS 中增加了对 WebP 的支持,看来现在是采取这一行动的正确时机。

4 个赞

上述提交增加了对 .webp 格式上传的支持。

在费了些周折让原始帖子重新渲染后,看来这个问题现在已经解决了(即“三星”标志已被下载并缓存在本地)。

我认为这个问题可以视为已解决。

6 个赞