代码之家  ›  专栏  ›  技术社区  ›  Integralist

将CloudFront配置为代理查询字符串作为S3对象键的一部分?

  •  2
  • Integralist  · 技术社区  · 6 年前

    我们将AWS CloudFront配置为将请求代理到S3 bucket上。

    AWS CloudFront允许您对其进行配置,以便查询字符串参数也被代理到源服务器上( docs )-我们也对此进行了配置。

    我的问题是,查询字符串param似乎没有包含在S3对象键查找中。

    例如,我们有如下对象键:

    • foo
    • foo?a=1
    • foo?b=2

    但是如果我们提出这样的要求 https://cf-distro-url.com/foo?a=1 https://cf-distro-url.com/foo?b=2 实际上,我们最终得到的是 /foo 内容,而不是具体的关键内容。

    以前有人经历过这种情况吗?和/或知道解决方案?

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Michael - sqlbot    6 年前

    使用web浏览器,CloudFront和S3(如果直接访问)都不会像您预期的那样工作 ? 在对象键中,因为 ?

    根据定义 ?

    获取对象的唯一方法是 ? 关键在于 浏览器 发送请求时使用 ? 逃逸为 %3F

    不能使用 ? 然后使用文字从浏览器中访问它 ? 在URL中。

    用演示 curl ,但浏览器行为是相同的。

    具有 /foo?bar 在URI中:

    $ curl -v 'http://.....s3.amazonaws.com/foo?bar=1'
    * About to connect() to .....s3.amazonaws.com port 80 (#0)
    *   Trying x.x.x.x... connected
    > GET /foo?bar=1 HTTP/1.1
    
    < HTTP/1.1 404 Not Found
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Error>
      <Code>NoSuchKey</Code>
      <Message>The specified key does not exist.</Message>
      <Key>foo</Key>                                      <<< requested object is "foo"
      <RequestId>...</RequestId>
      <HostId>...</HostId>
    </Error>
    

    具有 /foo%3Fbar=1 在URI中:

    $ curl -v 'http://.....s3.amazonaws.com/foo%3Fbar=1'
    * About to connect() to .....s3.amazonaws.com port 80 (#0)
    *   Trying x.x.x.x... connected
    > GET /foo%3Fbar=1 HTTP/1.1
    
    < HTTP/1.1 404 Not Found
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Error>
      <Code>NoSuchKey</Code>
      <Message>The specified key does not exist.</Message>
      <Key>foo?bar=1</Key>                                <<< requested object is "foo?bar=1"
      <RequestId>...</RequestId>
      <HostId>...</HostId>
    </Error>
    

    这是URL形成方式的限制,而不是在S3(或CloudFront)中。。。但S3文档中提到了这一点:

    键名中的以下字符可能需要额外的代码处理,并且可能需要URL编码或引用为十六进制

    ...

    问号(“?”)

    http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-keys

    ? 具有特定含义。

    无论CloudFront是否将查询字符串传递给S3,网络行为都是一样的——查询字符串不是键的一部分。

        2
  •  0
  •   Kannaiyan    6 年前

    看起来你正在以这样的方式发送,它会被CloudFront翻译。您需要像下面这样查询对象

    https://cf-distro-url.com/foo%3Fa%3D1

    您需要对这些字符执行URI编码,以便将它们作为对象名传递给S3。

    希望有帮助。