代码之家  ›  专栏  ›  技术社区  ›  random

在服务器上检测HTTPS vs HTTP发送回任何有用信息

  •  5
  • random  · 技术社区  · 16 年前

    有点类似于“ Detecting https requests in php ":

    https://example.com/pog.php http://example.com/pog.php 甚至反之亦然。

    问题:

    • 服务器正在通过端口80发送这两个请求,因此无法在HTTPS版本上检查443
    • apache_request_headers() apache_response_headers() 都在发回同样的东西
    • 页面在两个URL调用上吐出的服务器反馈数据与会话ID的保存完全相同。Bummer。

    是否有任何页面上的方法来检测是否通过SSL或非SSL调用它?

    编辑 : $_SERVER["HTTPS"] 无论您是通过SSL还是非SSL查看站点,都不存在、是否已打开。出于某种原因,主机选择为所有加密的HTTPS请求提供服务,但关闭端口80。因此,这个 $\u服务器[“HTTPS”]

    (是的,这意味着它在FF或Chrome中被标记为部分无效的SSL证书。但这部分并不重要。)

    此外,从检测URL中获得的最多信息是斜杠。PHP无法查看请求是否已被删除 https http 在前面。

    2 回复  |  直到 8 年前
        1
  •  23
  •   Robert    10 年前

    关键词——负载平衡器

    问题归结为负载平衡器正在处理SSL加密/解密,并且对Web服务器完全透明。

    Request:  Client -> 443or80 -> loadbalancer -> 80 -> php
    Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client
    

    这里真正的问题是“您是否可以控制负载平衡器配置?”


    如果你这样做,

    在apache中,配置两个不同的虚拟主机:

    <VirtualHost 1.2.3.4:80>
       ServerName foo.com
       SetEnv USING_HTTPS 0
       ...
    </VirtualHost>
    
    <VirtualHost 1.2.3.4:81>
       ServerName foo.com
       SetEnv USING_HTTPS 1
       ...
    </VirtualHost>
    

    然后是环境变量 USING_HTTPS 要么 1 0 $_SERVER PHP中的数组。那不是很酷吗?


    如果您无权访问负载平衡器配置 协议 . 它们指定了如何连接以及通过何种格式发送信息,但在这两种情况下,您都使用HTTP 1.1发出请求。在实际的请求中没有说明是HTTP还是HTTPS的信息。

    PHP的第六个参数 setcookie() http://www.php.net/setcookie )。也许您可以使用此参数设置cookie,然后在后续请求中检查它?

    (以上两项都不是防弹的)

    另一个实用的选择是在不同的域上获取SSL,例如 secure.foo.com


    我知道这不是一个最容易的问题,因为我在白天处理它(负载平衡的web集群后面是一个带有SSL模块的Cisco CSS负载平衡器)。

    最后,您可以始终采取这样的观点,即您的web应用程序在需要时应切换到SSL模式,并相信用户不会将其移回(毕竟,在线(通常)是他们的数据)。

    希望能有点帮助。

        2
  •  4
  •   nabrond    16 年前
    $\u服务器[“HTTPS”]不存在,无论是否打开,无论您是通过SSL还是非SSL查看站点。出于某种原因,主机选择为所有加密的HTTPS请求提供服务,但关闭端口80。因此,$_服务器[“HTTPS”]从来没有打开过,也没有,只是没有关于该服务器点的有用反馈。因此,该参数始终为空。

    SSLOptions +StdEnvVars

    推荐文章