61

我已经设置了 Amazon S3 来为我的静态站点提供服务,speakeasylinguistics.com. 所有 DNS 的东西似乎都可以正常工作,因为dig +recurse +trace www.speakeasylinguistics.com输出正确的 DNS 信息。

但是,当您使用端点在浏览器中访问该站点时index.html,页面会下载,而不是被提供。我该如何解决?

我试过 Chrome、Safari、FF。它发生在所有人身上。我使用了亚马逊关于将自定义域托管到 T的演练。

4

10 回答 10

56

对您发布的网址运行 curl -I 会产生以下结果:

curl -I http://speakeasylinguistics.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 200 OK
x-amz-id-2: DmfUpbglWQ/evhF3pTiXYf6c+gIE8j0F6mw7VmATOpfc29V5tb5YTeojC68jE7Rd
x-amz-request-id: E233603809AF9956
Date: Sun, 18 Aug 2013 07:58:55 GMT
Content-Disposition: attachment
Last-Modified: Sun, 18 Aug 2013 07:05:20 GMT
ETag: "eacded76ceb4831aaeae2805c892fa1c"
Content-Type: text/html
Content-Length: 2585
Server: AmazonS3

这条线是罪魁祸首:

Content-Disposition: attachment

如果您使用的是 AWS 控制台,我相信这可以通过在 S3 中选择文件并通过删除此属性来修改其元数据来更改。

于 2013-08-18T08:10:09.630 回答
49

如果您使用的是Hashicorp Terraform,您可以content-typeaws_s3_bucket_object上指定如下

resource "aws_s3_bucket_object" "index" {
  bucket = "yourbucketnamehere"
  key = "index.html"
  content = "<h1>Hello, world</h1>"

  content_type = "text/html"
}

这应该在浏览器中适当地提供您的内容。

于 2017-10-24T23:11:43.327 回答
32

如果您以编程方式执行此操作,则可以在上传中设置ContentType和/或参数。ContentDisposition

[PHP 示例]

      $output = $s3->putObject(array(
          'Bucket' => $bucket,
          'Key' => md5($share). '.html',
          'ContentType' => 'text/html',
          'Body' => $share,
      ));

putObject 文档

于 2015-06-02T15:10:41.140 回答
4

如果你们尝试使用 Boto3 和 python 3.7 或更高版本上传它,请尝试使用

s3 = boto3.client('s3')
S3.upload_file(local_file,bucket,S3_file,ExtraArgs={'ContentType':'text/html'})

用于更新 Content-Type

于 2020-03-11T06:55:07.373 回答
4

对于其他面临此问题的人,您可以在Properties > Static website hosting. 例如,提供的 URL 是

http://{bucket}.s3-website-{region}.amazonaws.com

但应该是

http://{bucket}.s3-website.{region}.amazonaws.com

注意和.之间。websiteregion

于 2021-08-02T18:45:00.827 回答
1

我最近遇到了这个问题,根本原因似乎是启用了对象版本控制。在存储桶上禁用版本控制后,索引 HTML 按预期提供。

于 2021-08-17T19:16:38.907 回答
1

我最近出现了同样的问题,问题是 CloudFront 和 S3 Origin 的行为发生了变化,如果您的 S3Bucket 配置为提供静态网站,您需要将您的源更改为 HTTPS:// 端点而不是从下拉列表中选择 S3 来源,如果您使用的是 terraform,您的来源应该是 aws_s3_bucket.var。website_endpoint而不是 aws_s3_bucket.var。bucket_domain_name

请参阅此处的 AWS 文档

于 2021-02-28T05:43:55.113 回答
1

从 NodeJS 上传到 S3 静态站点时,我遇到了同样的问题。content-type正如其他人所提到的,该问题是由于上传文件时丢失造成的。使用网页界面时,content-type会自动为您申请;但是,手动上传时,您需要指定它。S3 内容类型列表

在 NodeJS 中,您可以像这样附加内容类型:

const { extname } = require('path');
const { createReadStream } = require('fs');

// add more types as needed
const getMimeType = ext => {
    switch (ext) {
        case '.js':
            return 'application/javascript';
        case '.html':
            return 'text/html';
        case '.txt':
            return 'text/plain';
        case '.json':
            return 'application/json';
        case '.ico':
            return 'image/x-icon';
        case '.svg':
            return 'image/svg+xml';
        case '.css':
            return 'text/css'
        case '.jpg':
        case '.jpeg':
            return 'image/jpeg';
        case '.png':
            return 'image/png';
        case 'webp':
            return 'image/webp';
        case 'map':
            return 'binary/octet-stream'
        default:
            return 'application/octet-stream'    
    }
};

(async() => {
    const file = './index.html';
    const params = {
        Bucket: 'myBucket',
        Key: file,
        Body: createReadStream(file),
        ContentType: getMimeType(extname(file)),
    };
    await s3.putObject(params).promise();
})();
于 2021-12-29T21:29:07.407 回答
0

我遇到了同样的问题,我已经通过这种方式解决了。在 S3 Bucket,单击 o index.html 复选框,单击 con Actions 选项卡,编辑元数据,您会注意到在元数据选项中显示“类型:系统定义,键:内容类型,值:二进制/八位字节流”。更改并放入“html”并保存更改。然后点击index.html,“打开”按钮。这对我有用。

于 2021-12-29T02:15:31.650 回答
0

如果您使用的是AWS S3 Bitbucket Pipelines Python,则添加参数content_type如下:

s3_upload.py

def upload_to_s3(bucket, artefact, bucket_key, content_type):
...

def main():
...
    parser.add_argument("content_type", help="Content Type File")
...

if not upload_to_s3(args.bucket, args.artefact, args.bucket_key, args.content_type):

并修改bitbucket-pipelines.yml如下:

...
- python s3_upload.py bucket_name file key content_type 
...

其中content_type参数可以是以下之一:MIME 类型(IANA 媒体类型)

于 2019-11-26T05:49:28.577 回答