Amazon s3 URL + 被编码为 %2?

Jus*_*all 4 amazon-s3

我已将 Amazon s3 与我在 WP Engine 的托管帐户集成。一切都很好,除了包含 + 字符的文件。

例如,在以下情况下,当文件被命名为:test+2.pdf http://support.mcsolutions.com/wp-content/uploads/2011/11/test+2.pdf = 不起作用。

以下网址是亚马逊网址。请注意 + 字符已被编码。有没有办法阻止/改变这种情况? http://mcsolutionswpe.s3.amazonaws.com/mcsupport/wp-content/uploads/2011/11/test%2b2.pdf

其他 URL 工作正常:亚马逊 -> http://mcsolutionswpe.s3.amazonaws.com/mcsupport/wp-content/uploads/2011/11/test2.pdf 网站 -> http://support.mcsolutions.com/wp-内容/uploads/2011/11/test2.pdf

Mic*_*bot 6

如果我正确理解你的问题,那么不,没有办法真正改变这一点。

原因似乎是多年前在 S3 上做出的一个不幸的设计决策——当然,现在无法修复,因为它会破坏太多其他事情——其中涉及 S3 使用 URL 转义的错误变体(其中包括但不完全限于 URL 路径部分中的“百分比编码”,其中发送对象的密钥。

在查询字符串(?片段之前但之后的 URL 可选部分,如果存在,以 开头#),该+字符被视为等同于[SPACE], (ASCII Dec 32, Hex 0x20)。

...但在 URL 的路径中,情况不应如此。

...但在 S3 的实现中,确实如此。

所以+实际上并不意味着+,它意味着[SPACE]...因此,+也不能意味着+...这意味着需要不同的表达式来传达+- 并且该值是%2B+(ASCII Dec 43 ,十六进制 0x2B)。

当您上传文件时,+您正在使用的代码(假设它理解这个怪癖,显然它确实如此)将其转换为S3期望的格式(%2B)...因此%2B当您下载文件时必须使用so来请求它文件。

奇怪但并不奇怪的是,如果您将文件存储在 S3 中,并且路径中带有空格,您实际上可以使用 a+或空格甚至所有这三个来请求它%20,并且所有这三个都应该实际获取该文件......所以如果看到+in路径是你想要的,你可以通过用空格保存它来解决这个问题,尽管如果有解决方法的话,这个解决方法应该被描述为“黑客”。这种策略不适用于生成预签名GETURL 的库,除非它们专门设计为忽略 S3 的标准行为并执行您想要的操作......但对于公共链接,它应该本质上是等效的。