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

cut*_*ine 3 amazon-s3 amazon-web-services 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
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

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

如果我;charset=utf-8从上面的命令中删除它,它可以工作,但Content-Type设置为text/htmlnot text/html;charset=utf-8.

DPF*_*DPF 13

两步过程解决您的问题.

(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)
Run Code Online (Sandbox Code Playgroud)

通过将以下内容添加到.profile或.bashrc或.zshrc(同样,取决于您的系统),确保您的python库在您的路径中.

export PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

但是如果你使用自制软件可能会导致冲突 - 只需对可执行文件进行符号链接.

ln -s /Library/Frameworks/Python.framework/Versions/2.7/bin/s3cmd /usr/local/bin/s3cmd
Run Code Online (Sandbox Code Playgroud)

关闭终端并重新打开.

s3cmd --version 
Run Code Online (Sandbox Code Playgroud)

仍然会输出

s3cmd version 1.5.0-alpha3 - but its the patched version.
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

如果上传成功并将Content-Type设置为"text/html; charset = utf-8",但您在此过程中看到此错误:

WARNING: Module python-magic is not available...
Run Code Online (Sandbox Code Playgroud)

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

安装python-magic:

sudo pip install python-magic
Run Code Online (Sandbox Code Playgroud)

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

sudo easy_install -U pip
Run Code Online (Sandbox Code Playgroud)

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

这是将静态Middleman站点部署到s3的示例Thor任务的要点. 此任务允许您在本地重命名文件并使用s3cmd同步,而不是使用S3cmd put逐个重命名它们.