首页 > 解决方案 > HTTPS 上的套接字错误但 HTTP 上没有 | PHP

问题描述

我有一个通过套接字运行的后台脚本,如下所示

   if (strstr($_SERVER['PHP_SELF'], "/")) { 
        $location = array(); 
        $location = explode("/", $_SERVER['PHP_SELF']); 
        $folder = $location[count($location) - 2]; 
    } 
    else { 
        $folder = $_SERVER['PHP_SELF']; 
    }

    //script, runs in background
    $host = HOST;
    $remote_house = 'https://'.$host.'/'.$folder.'/controllers/background';

    $socketcon = fsockopen($host, 80);

    if($socketcon) {   
        $socketdata = "GET $remote_house/".$scriptName." HTTPS 1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n"; 
        fwrite($socketcon, $socketdata); 
        fclose($socketcon);
    }

这在 localhost 和 HTTP 联机上正常工作,但在 HTTPS 上无法正常工作,并出现此错误。

HTTP/1.0 400 错误请求缓存控制:无缓存连接:关闭内容类型:文本/html 400 错误请求您的浏览器发送了无效请求。

任何的想法?

标签: phpsocketshttps

解决方案


$socketdata = "GET $remote_house/".$scriptName." HTTPS 1.1\r\n...

这既是无效的 HTTP 请求,也是无效的 HTTPS 请求。HTTP/1.1首先,不应该HTTPS 1.1。对于 HTTPS,您需要首先创建到对等方的 SSL/TLS 连接,然后您可以通过此连接发送 HTTP 请求。

$remote_house = 'https://'.$host.'/'.$folder.'/controllers/background';

此外,请求中的路径组件不应包含完整的 URL,而应仅包含路径,即'/'.$folder.'/controllers/background'.

$socketcon = fsockopen($host, 80);

对于 HTTPS,您需要连接到端口 443 而不是 80,然后在发送 HTTP 请求之前在那里进行 SSL/TLS 握手。


推荐阅读