【问题标题】:Socket error on HTTPS but not on HTTP | PHPHTTPS 上的套接字错误但 HTTP 上没有 | PHP
【发布时间】:2018-10-24 07:11:32
【问题描述】:

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

   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 错误请求 您的浏览器发送了一个无效请求。

有什么想法吗?

【问题讨论】:

    标签: php sockets https


    【解决方案1】:
    $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 握手。

    【讨论】:

    • 我明白了。我该如何握手?
    • @user5349142:请参阅fsockopen 的文档,其中描述了如何创建 TLS 套接字。简而言之:fsockopen('tls://'.$host,...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2014-11-09
    相关资源
    最近更新 更多