3

我在 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/htmlnot text/html;charset=utf-8

4

1 回答 1

14

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

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

要在 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)。

这是将静态中间人站点部署到 s3 的示例 thor 任务的要点。 此任务允许您在本地重命名文件并使用 s3cmd sync 而不是使用 S3cmd put 一个接一个地重命名它们。

于 2013-04-25T16:08:50.703 回答