2013-04-20 74 views
3

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

我知道我可以在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错误:403(SignatureDoesNotMatch):我们计算请求签名不匹配您提供的签名。检查你的密钥和签名方法。

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

回答

13

两步法解决你的问题。

(1)升级您的S3cmd安装。版本1.0.x不具备设置字符集的功能。从master on github安装。 Master包含此(1)bug和此(2)bug的修补程序,这些修补程序导致无法识别早期版本中内容类型的格式和“先前定义之前调用”问题。

从主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" 

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

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的;字符集= utf-8“,但你看到这个过程中的错误:

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

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

安装python-魔法:

sudo pip install python-magic 

PIP随着近期OSX升级打破了,所以你可能需要更新PIP:

sudo easy_install -U pip 

这将做到这一点。所有这一切都与S3cmd同步 - 不只是放在。我建议你将s3cmd同步放入一个thor类型的任务中,这样你就不会忘记在任何特定的文件上设置mime类型(如果你对gzip文件使用python-magic)。

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

+0

感谢您的回答。 s3cmd --version显示我正在使用1.5.0-alpha1。我尝试使用--mime-type,正如你之前提出的那样,但后来我得到了一个不同的错误:UnboundLocalError:在分配之前引用的本地变量'content_encoding' – cutemachine 2013-04-26 09:52:10

+0

更改了答案以反映只有主人 - 而不是早期的软件包解决这两个问题。 – DPF 2013-04-26 19:17:59

+0

添加了从git repo安装s3cmd的指示 – DPF 2013-04-26 20:42:02

相关问题