【问题标题】:Setting Content-Type for static website hosted on AWS S3为 AWS S3 上托管的静态网站设置 Content-Type
【发布时间】:2013-04-20 22:36:54
【问题描述】:

我在 S3 上托管一个静态网站。要将我的网站推送到亚马逊,我使用 s3cmd 命令行工具。除了将 Content-Type 设置为 text/html;charset=utf-8 之外,一切正常。

我知道我可以在 HTML 文件的元标记中设置字符集,但我想避免它。

这是我正在使用的确切命令:

s3cmd --add-header='Content-Encoding':'gzip'
    --add-header='Content-Type':'text/html;charset=utf-8'
    put index.html.gz s3://www.example.com/index.html

这是我得到的错误:

ERROR: S3 error: 403 (SignatureDoesNotMatch): 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

如果我从上述命令中删除 ;charset=utf-8 部分,它可以工作,但 Content-Type 设置为 text/html 而不是 text/html;charset=utf-8

【问题讨论】:

    标签: amazon-web-services amazon-s3 s3cmd


    【解决方案1】:

    解决您的问题的两步过程。

    (1) 升级您的 S3cmd 安装。 1.0.x 版没有设置字符集的能力。从master on github 安装。 Master 修复了这个 (1) bug 和这个 (2) bug,导致无法识别内容类型的格式以及早期版本中的“定义前调用”问题。

    要在 OSX 上从 master 安装 s3cmd,请执行以下操作:

    git clone https://github.com/s3tools/s3cmd.git
    cd s3cmd/
    sudo python setup.py install (sudo optional based on your setup)
    

    通过将以下内容添加到您的 .profile 或 .bashrc 或 .zshrc(同样,取决于您的系统),确保您的 python 库在您的路径中。

    export PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:$PATH"
    

    但如果您使用自制软件可能会导致冲突 - 只需符号链接到可执行文件。

    ln -s /Library/Frameworks/Python.framework/Versions/2.7/bin/s3cmd /usr/local/bin/s3cmd
    

    关闭终端并重新打开。

    s3cmd --version 
    

    仍然会输出

    s3cmd version 1.5.0-alpha3 - but its the patched version.
    

    (2) 升级后,使用:

    s3cmd --acl-public --no-preserve --add-header="Content-Encoding:gzip" --add-header="Cache-Control:public, max-age=86400" --mime-type="text/html; charset=utf-8" put index.html s3://www.example.com/index.html
    

    如果上传成功并将 Content-Type 设置为 "text/html; charset=utf-8" 但您在此过程中看到此错误:

    WARNING: Module python-magic is not available...
    

    我更喜欢没有 python-magic - 我发现如果你不专门设置 mime-type,python-magic 经常会猜错。安装 python-magic 但一定要在 s3cmd 中设置 mime-type="application/javascript" 否则如果你在本地 gzip 你的 js,python-magic 会猜测它是 "application/x-gzip"。

    安装python-magic:

    sudo pip install python-magic
    

    PIP 因最近的 OSX 升级而中断,因此您可能需要更新 PIP:

    sudo easy_install -U pip
    

    这样就可以了。所有这一切也适用于 S3cmd 同步 - 不仅仅是放。我建议你将 s3cmd sync 放入一个 thor 类型的任务中,这样你就不会忘记在任何特定文件上设置 mime 类型(如果你在 gzip 文件上使用 python-magic)。

    This is a gist of an example thor task for deploying a static Middleman site to s3. 此任务允许您在本地重命名文件并使用 s3cmd sync 而不是使用 S3cmd put 一个一个地重命名它们。

    【讨论】:

    • 感谢您的回答。 s3cmd --version 显示我使用的是 1.5.0-alpha1。我尝试按照您之前的建议使用 --mime-type ,但后来我得到一个不同的错误:UnboundLocalError: local variable 'content_encoding' referenced before assignment
    • 更改答案以反映只有 master - 而不是早期的包解决了这两个问题。
    • 添加了从 git repo 安装 s3cmd 的说明
    • 再次感谢您为我提供的帮助。现在它几乎可以工作了。我使用命令s3cmd --add-header="Content-Encoding:gzip" --add-header="Cache-Control:public, max-age=86400" --mime-type="text/html; charset=utf-8" put index.html.gz s3://www.example.com/index.html。现在 Content-Type 是正确的,但 Content-Encoding 是错误的。它应该是 gzip,但它在 AWS 控制台中显示为 UTF-8。
    • 请注意,我将一个 gzip 压缩文件传输到存储桶:index.html.gz(本地文件)-> index.html(在 S3 上)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2012-07-27
    • 2021-07-16
    • 2021-05-23
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多