Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在服务器上检测HTTPS vs HTTP发送回任何有用信息_Php_Apache_Ssl_Https - Fatal编程技术网

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

Php 在服务器上检测HTTPS vs HTTP发送回任何有用信息,php,apache,ssl,https,Php,Apache,Ssl,Https,有点像“”: 想去,甚至想去 问题: 无法从$\u服务器[“HTTPS”]读取任何内容,因为它不在那里 服务器正在通过端口80发送这两个请求,因此无法在HTTPS版本上检查443 apache\u请求\u头()和apache\u响应\u头()正在发回相同的内容 不能告诉loadbalancer任何事情或让它发送额外的东西 页面在两个URL调用上吐出的服务器反馈数据与会话ID的保存完全相同。Bummer 是否有任何页面上的方法来检测是否通过SSL或非SSL调用它 编辑:$\u服务器[“HTTP

有点像“”:

想去,甚至想去

问题:

  • 无法从$\u服务器[“HTTPS”]读取任何内容,因为它不在那里
  • 服务器正在通过端口80发送这两个请求,因此无法在HTTPS版本上检查443
  • apache\u请求\u头()
    apache\u响应\u头()
    正在发回相同的内容
  • 不能告诉loadbalancer任何事情或让它发送额外的东西
  • 页面在两个URL调用上吐出的服务器反馈数据与会话ID的保存完全相同。Bummer
是否有任何页面上的方法来检测是否通过SSL或非SSL调用它

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

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

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

关键词——负载平衡器

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

Request:  Client -> 443or80 -> loadbalancer -> 80 -> php
Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client
这里真正的问题是“您是否可以控制负载平衡器配置?”


如果您这样做,有几种方法可以处理它。将负载平衡器配置为具有单独的HTTP和HTTPS服务定义。然后将HTTP流量发送到web服务器的端口80,将HTTPS流量发送到web服务器的端口81。(端口81不被其他任何东西使用)

在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>

ServerName foo.com
使用0的SetEnv
...
ServerName foo.com
SetEnv使用_HTTPS 1
...
然后,使用HTTPS的环境变量
将是
1
|
0
,具体取决于哪个虚拟主机拾取了它。这将在PHP中的
$\u服务器
数组中提供。那不是很酷吗


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

但不要灰心。这里有几个想法

PHP的
setcookie()
函数的第6个参数可以指示客户端仅通过HTTPS连接发送cookie()。也许您可以使用此参数设置cookie,然后在后续请求中检查它

另一种可能是使用JavaScript根据协议更新每个页面上的链接(添加GET参数)

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

另一个实用的选择是在不同的域上获取SSL,例如
secure.foo.com
。然后你可以使用上面的虚拟主机技巧


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

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

希望能有所帮助。

$\u服务器[“HTTPS”]不存在,已打开或未打开,无论您是通过SSL还是非SSL查看站点。出于某种原因,主机选择为所有加密的HTTPS请求提供服务,但关闭端口80。因此,$_服务器[“HTTPS”]从来没有打开过,也没有,只是没有关于该服务器点的有用反馈。因此,该参数始终为空。
您必须确保提供商在您站点的VHOST条目中有以下行:
SSLOptions+StdEnvVars
。这一行告诉Apache在脚本环境(PHP)中包含SSL变量。

永远不要信任用户。页面必须保持在HTTP版本上,所以如果他们尝试使用HTTPS,他们会返回到HTTP版本。不过我还是喜欢你的回答。