【问题标题】:AWS Elasticbeanstalk single instance Force SSL Redirect loopAWS Elasticbeanstalk 单实例强制 SSL 重定向循环
【发布时间】:2013-12-20 05:06:08
【问题描述】:

我遇到了强制使用 ssl 的问题。我正在使用 codeigniter 并将其部署在带有 elasticbeanstalk 的 AWS 单实例中。我的 htaccess 规则如下:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

但浏览器进入重定向循环。无论我尝试什么都没有解决这个问题。

【问题讨论】:

  • 这里有同样的问题。事实是,在 ssl.conf 中,来自端口 443 的每个调用都“代理”到端口 80,因此您永远不会打开 https =。您找到解决方法了吗?

标签: .htaccess codeigniter mod-rewrite ssl amazon-web-services


【解决方案1】:

这是官方的方式。在 AWS 文档中找到。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

来源

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/security-configuration/https-redirect/php/https-redirect-php.config

【讨论】:

    【解决方案2】:

    这是正确的方法:

    RewriteEngine on
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    

    【讨论】:

    • 这会导致我出现重定向循环。
    【解决方案3】:

    我遇到了同样的问题。这对我有用:

    RewriteCond %{SERVER_PORT} !=443
    RewriteCond %{SERVER_ADDR}   !^127\.0\.0\.1
    RewriteRule (.*) https://%{SERVER_NAME}/$1 [L]
    

    【讨论】:

      【解决方案4】:

      正如我在评论中提到的:

      在 ssl.conf 中,来自端口 443 的每个调用都被“代理”到端口 80,因此您永远不会打开 https =。

      我做了一些测试,发现 ssl.conf 中的 ProxyPass 指令并不是简单地将每个请求从端口 443 重定向到 localhost:80,而是基本上通过端口 80 从头开始​​重复向 Apache 的请求(至少,我是这么理解的)。

      查看$_SERVER的值,发现HTTP_X_FORWARDED_FORHTTP_X_FORWARDED_HOSTHTTP_X_FORWARDED_SERVERHTTPS 请求(但在 HTTP 请求期间 NOT 设置),同时 SERVER_ADDRREMOTE_ADDR HTTPS 请求期间设置为 127.0.0.1(但对于 HTTP 请求,它们设置为不同的值)。 p>

      我假设您可以使用类似这样的方式轻松检查您的请求是否是纯 HTTP(检查语法,我对 Apache 很垃圾):

      RewriteCond %{ENV:HTTP_X_FORWARDED_SERVER}   !^$
      

      RewriteCond %{ENV:SERVER_ADDR}   !^127\.0\.0\.1
      

      注意:我在 AWS 文档中找不到任何参考资料,这只是一个经验结果……他们可以轻松改变这种行为!

      编码愉快! :)

      【讨论】:

        【解决方案5】:

        我相信(为 /status 提供例外)您正在使用“负载平衡、自动缩放环境”,这意味着您在中间有一个弹性负载平衡器。

        如果您使用 Elastic Load Balancing 设置您的环境,那么可能发生的情况是 Elastic Load Balancer (ELB) 正在使用(服务)安全内容 (HTTPS)。

        但是,如果 ELB 和 EC2 实例之间的流量不安全,您的代码将始终检测到不安全的连接,因为 EC2 客户端实际上是 ELB,而不是最终用户(将 ELB 视为代理)。

        旁注,我不确定 SERVER_NAME 变量如何与中间的 ELB 一起工作。

        也就是说,如果您打算使用单实例、非负载平衡环境,则可以“关闭”负载平衡器(可能从 2013 年 7 月开始)。 (参见参考文献#3)

        参考:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.elb.html http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-types.html Elastic Beanstalk without Elastic Load Balancer

        【讨论】:

          猜你喜欢
          • 2013-12-20
          • 2014-09-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 2017-06-14
          • 2018-10-19
          • 2016-04-16
          相关资源
          最近更新 更多