检测www。使用sed

时间:2019-03-12 14:12:30

标签: amazon-web-services sed amazon-elastic-beanstalk

我不熟悉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。

我该如何实现?

1 个答案:

答案 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实例中,并验证文件是否正确