0

我们缓存多种尺寸的图像。

图片信息:

所以我们构建了以下图片缓存 URL:

http://cache.example.com/image/120x150/ksjdaflkj678687TYTGGGShjk78/image-file-name.jpg

当请求此 URL 时,http://cache.example.com/image/120x150/ksjdaflkj678687TYTGGGShjk78/image-file-name.jpg,这在幕后(htaccess 类型的东西)被重写为:http://cache。 example.com/image.php?height=120&width=150&originalUrlHashed=ksjdaflkj678687TYTGGGShjk78&preferredFileName=image-file-name.jpg

散列图像被解码,从原始位置下载,调整大小并物理保存在这里:/image/120x150/ksjdaflkj678687TYTGGGShjk78/image-file-name.jpg。为什么?因为在第二个请求中,文件物理存在于磁盘上并作为普通文件返回,然后我们可以使用 apache2 mod_expires 缓存,而不是在每次请求时下载和调整图像大小。

问题在于这样的远程图像 URL:

原始图像哈希为:

  • eNptzbtOAzEQheGnoZwdr40JQkJIBIo0kI5y5cusM4pjWx4j5fFJICXt_x3pHMZoT4g8Rcp5CvWE0Qme3eTkcMaUq3cZhAdBJOFU7rT6en9FZR6MUXYD3vtH8LPR4Fcd4F4HFZ01q9MzzvjZOXFxeV_SC8fnt8sH7nuN32Esu5NLJHhtyzYzlbHcSPCjDvK1HgV3RRr3WpZ_0my7EHqSUVfMro3agG8IvwgbqxUkKtQ5wN8SrFJQ0tQk_gCey1fZ

这使得 URL 看起来像这样:

此 URL 的哈希部分超过 255 个字符,这会导致 Apache 错误 - https://serverfault.com/questions/120397/max-length-of-url-257-characters-for-mod-rewrite

编辑:只是补充一下 - 问题在于哈希的长度。使用 255 个字符以下的哈希,此解决方案完美运行。

这里有几个考虑:

  1. 缓存 URL 与调用它的服务器位于不同的服务器上。它们不共享数据库,因此原始 URL 必须包含在 URL 中。
  2. 我需要对 URL 进行哈希处理并使用哈希作为目录名称,以便我们可以将调整大小的文件物理保存到磁盘以供将来请求。
  3. 这意味着根据请求 - 它会神奇地创建文件并将其保存到磁盘。根据请求二,它只返回物理图像。
  4. 如果 cache.example.com 和调用 URL 的网站在同一个服务器上,并且可以共享一个数据库,那么我们可以将图像 URL 保存到一个表中并返回一个哈希或键或其他东西。不幸的是,这不是一个选择。

解决方案?

  • 我能想到的唯一解决方案是以某种方式压缩 URL。但是,由于我需要(并且确实)对其进行 base64 编码以使其沿 URL 工作,因此这会增加额外的大小。

有没有人有任何想法?

我遇到的问题与这个问题非常相似。

4

1 回答 1

0

上次我检查时,一个 URL 最多可以包含 2083 个字符。我怀疑是否有一种算法可以使其适合少于 255 个 US-ASCII 字符。

由于您似乎是首先生成 URL 的人,因此我只需将目标 URL 存储在服务器上(例如,在数据库表中)并使用其关联 ID(或实际哈希)。然后,从 ID 或哈希中获取 URL 将变得很简单。

GET 方法不是为传输大量数据而设计的。

编辑:

我的回答显然不够清楚,所以我会尽力澄清它。

假设您要链接到http://www.example.com/media/test.jpg. 到目前为止,您将混淆http://www.example.com/media/test.jpg为 eguggcabcjjjwrknzcyrmpbzjzrqvnxgrfgwwct并生成如下 URL:

http://cache.example.com/image/150x125/uggcabcjjjwrknzcyrmpbzjzrqvnxgrfgwwct

我的建议是将 URL 存储到数据库表中:

url_id url
====== =====================================
     1 http://www.example.com/media/test.jpg

...然后您创建一个这样的 URL:

http://cache.example.com/image/150x125/1

当你 mod_rewrite URL 时,你运行这个查询:

SELECT url
FROM url_cache
WHERE url_id=1

...而且,瞧!,您http://www.example.com/media/test.jpg无需在 URL 中传输它即可返回。

或者,您可以存储和使用真正的哈希:

url_id url                                   hash
====== ===================================== =====
     1 http://www.example.com/media/test.jpg ae4a962c5c40dc8d59554a503719ce445c047246837c7203d319cd5b0b5b3703

... 和:

http://cache.example.com/image/150x125/ae4a962c5c40dc8d59554a503719ce445c047246837c7203d319cd5b0b5b3703

由于它是真正的散列而不是模糊的文本,因此您事先知道大小。

于 2013-04-28T15:48:30.163 回答