我在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
。
答案 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逐个重命名。