我是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。
我怎样才能做到这一点?
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中使用NO配置部署您的应用程序,然后从ELB控制台部署Rebuild Environment。这应该给你一个空白的石板。然后只需将上面的文件添加到.ebextensions并重新部署。
*另一个注意事项,您可以ssh到您的ec2实例并验证该文件是否正确