为AWS S3上托管的静态网站设置Content-Type

时间:2013-04-20 22:36:55

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

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

我知道我可以在HTML文件的元标记中设置charset,但我想避免使用它。

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

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 个答案:

答案 0 :(得分:13)

解决问题的两个步骤。

(1)升级S3cmd的安装。版本1.0.x无法设置字符集。从master on github安装。 Master包含对此(1)bug和this(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或python-magic中设置mime-type =“application / javascript”如果你在本地gzip你的js,它会猜测它是“application / x-gzip”。

安装python-magic:

sudo pip install python-magic

PIP打破了最近的OSX升级,因此您可能需要更新PIP:

sudo easy_install -U pip

那就行了。所有这一切都适用于S3cmd同步 - 不仅仅是放。我建议你把s3cmd同步放到一个Thor类型的任务中,这样你就不要忘记在任何特定文件上设置mime-type(如果你在gzip文件上使用python-magic)。

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