我不熟悉sed,几乎感到困惑。 这是我项目的nginx文件夹中的内容:
files:
"/tmp/45_nginx_https_rw.sh":
owner: root
group: root
mode: "000644"
content: |
#! /bin/bash
CONFIGURED=`grep -c "return 301 https" /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf`
if [ $CONFIGURED = 0 ]
then
sed -i '/listen 8080;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
logger -t nginx_rw "https rewrite rules added"
exit 0
else
logger -t nginx_rw "https rewrite rules already set"
exit 0
fi
上面的代码就像一个超级按钮一样工作,如果它们是http请求,则基本上将所有请求重定向到https。 但是,我需要添加一个片段来检查网址是否具有www并重定向到非www。 因此,例如www.test.com将被重定向到test.com。
我该如何实现?
答案 0 :(得分:1)
AWS推荐的解决方案是完全重写“ /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf”
您可以通过在.ebextensions中添加此文件来做到这一点:https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/security-configuration/https-redirect/docker-sc/https-redirect-docker-sc.config
我对www重定向做了一个额外的调整:
location / {
set $redirect 0;
if ($http_x_forwarded_proto != "https") {
set $redirect 1;
}
if ($host ~ ^www\.(?<domain>.+)$) {
set $redirect 1;
}
if ($http_user_agent ~* "ELB-HealthChecker") {
set $redirect 0;
}
if ($redirect = 1) {
return 301 https://ADDYOURDOMAINREDIRECTHERE$request_uri;
}
*还有一点需要注意,您的ec2实例可能已经具有一堆在找到解决方案时尝试过的配置文件。我建议在.ebextensions中部署没有配置的应用程序,然后从ELB控制台重建环境。这应该给您一个空白。然后只需将上面的文件添加到.ebextensions中,然后重新部署即可。
*另外,请注意,您可以将ssh放入ec2实例中,并验证文件是否正确