PHP模糊URL为调整大小的图像


PHP Obscured URL for Resized Images

我们缓存不同大小的图片。

图片信息:

  • 原始网址:http://www.example-store.com/images/some-image.jpg
  • 宽度:120
  • 身高:150
  • 首选图像文件名:Image - File - Name .jpg
因此,我们构建以下图像缓存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:

  • http://i.dell.com/das/xa.ashx/global网站- design%20web/03633057 bbb8 - b132 bf2c - 42 - c0da53fa21/1/originalpng?id=dell/product_images/dell_client_products/notebooks/inspiron_notebooks/inspiron_15rse/bestof/laptop inspiron - 15 -交易所- 7520 -通用- bestof - 500 ng.psd

原始图像哈希值为:

  • eNptzbtOAzEQheGnoZwdr40JQkJIBIo0kI5y5cusM4pjWx4j5fFJICXt_x3pHMZoT4g8Rcp5CvWE0Qme3eTkcMaUq3cZhAdBJOFU7rT6en9FZR6MUXYD3vtH8LPR4Fcd4F4HFZ01q9MzzvjZOXFxeV_SC8fnt8sH7nuN32Esu5NLJHhtyzYzlbHcSPCjDvK1HgV3RRr3WpZ_0my7EHqSUVfMro3agG8IvwgbqxUkKtQ5wN8SrFJQ0tQk_gCey1fZ

使得URL看起来像这样:

  • http://cache.example.com/image/150x125/enptzbtoazeqhegnozwdr40jqkjibio0ki5y5cusm4pjwx4j5ffjicxt_x3phmzot4g8rcp5cvwe0qme3etkcmauq3czhadbjofu7rt6en9fzr6muxyd3vth8lpr4fcd4f4hfz01q9mzzvjzoxfxev_sc8fnt8sh7nun32esu5nljhhtyzyzlbhcspcjdvk1hgv3rrr3wpz_0my7ehqsuvfmro3agg8ivwgbqxukktq5wn8srfjq0tqk_gcey1fz/laptop - inspiron 15 -交易所- 7520 -通用- bestof - 500 ng.jpg

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

编辑:只是为了补充-问题是哈希的长度。对于小于255个字符的散列,此解决方案可以完美地工作。

这里有几个注意事项:

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

解决方案?

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

有人有什么想法吗?

我遇到的问题和这个问题很相似。

上次我检查的时候,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混淆为uggcabcjjjwrknzcyrmpbzjzrqvnxgrfgwwct,并生成如下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

因为它是一个真正的散列而不是一个模糊的文本,所以你知道它的大小。