php - 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 错误请求您的浏览器发送了无效请求。
任何的想法?
解决方案
$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 握手。
推荐阅读
- primefaces - 如何过滤primefaces中的动态数据表?它不工作
- react-native - 如何在 react-native-maps 上的每个折线段上绘制箭头
- javascript - 无论如何要等待打印窗口在 print.js 中关闭
- java - 如何限制java菜单中的用户操作?
- java - Java 本机内存跟踪堆提交的数量远远超过堆转储的总数
- java - 将全局变量传递给对象
- c# - 为什么我可以得到该程序集中未引用的类的实例?
- python - 我怎么只能刮
- python-3.x - 如何通过用户输入运行多种颜色识别?
- json - 将 JSON 对象写入文件并改为写入 null