在AWS S3上托管静态网站时设置Content-Type

3

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

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

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

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

这是我收到的错误信息:

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

如果从上述命令中删除;charset=utf-8部分,它就能正常工作,但Content-Type会被设置为text/html而不是text/html;charset=utf-8

1个回答

14

解决问题的两个步骤。

(1) 升级您的S3cmd安装程序。 版本1.0.x没有设置字符集的功能。从Github主分支安装。 这个主分支包含修复了这个(1)错误和这个(2)错误,之前版本中会导致无法识别内容类型格式和"在定义之前调用"的问题。

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

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

确保您的Python库在路径中,可以将以下内容添加到您的.profile、.bashrc或.zshrc中(根据您的系统而定)。

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

但是,如果你使用 Homebrew 的话可能会导致冲突,因此最好将可执行文件建立符号链接。

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或python-magic中设置mime-type =“application / javascript”,否则,如果您在本地gzip js,则python-magic将猜测它为“application / x-gzip”。

安装python-magic:

sudo pip install python-magic

最近的OSX升级可能导致PIP出现故障,因此您可能需要更新PIP:

sudo easy_install -U pip

这样就行了。这一切都适用于S3cmd同步 - 而不仅仅是上传。我建议您将s3cmd同步放入类似于thor的任务中,以便您不会忘记在任何特定文件上设置mime类型(如果您正在对gzipped文件使用python-magic)。

这是一个示例Thor任务的要点,用于将静态Middleman网站部署到S3。此任务允许您在本地重命名文件,并使用s3cmd sync而不是使用S3cmd put单独重命名它们。


感谢您的回答。s3cmd --version 显示我正在使用 1.5.0-alpha1 版本。我尝试按照您之前提出的建议使用 --mime-type,但是我遇到了不同的错误:UnboundLocalError: local variable 'content_encoding' 在赋值之前被引用。 - cutemachine
增加了从git仓库安装s3cmd的指南。 - DPF
添加 --no-preserve 和 --acl-public 应该就可以了。你的重命名(去掉 .gz)是正确的,S3 将使用正确的头信息将其作为 gzipped 服务。 - DPF
请查看我添加到答案中的 Thor 任务 Gist。 - DPF
--no-preserve选项起到了关键作用。而Middleman的要点正是我一开始尝试构建的内容,以便将我的网站部署到S3上。非常感谢(包括虚拟拥抱) :) - cutemachine
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接