在共享主机上打开套接字

4
我将尝试使用以下代码在主机上打开套接字:
```

我尝试使用以下代码在主机上打开套接字:

```
$timeout = 10;
$s = stream_socket_client('mywebsite.com:80', $errcode, $errstring, $timeout);
$message = "GET /index.php HTTP/1.0\r\n\r\n";
fwrite($s, $message);
while(!feof($s)){
    echo fread($s, 1024);
}

这只是我找到的一个简单案例,问题在于每次运行代码,我都会得到不同的文件。我认为这是因为主机是共享的。

有没有办法克服这个问题,即可可靠地获得我想要的正确文件?

谢谢。

2个回答

3
在 HTTP 请求中,您需要指定访问的主机。正如您正确指出的那样,多个 DNS 记录可以指向同一个 IP 地址。
$message = "GET /index.php HTTP/1.1\r\nHost: hostname.com\r\n\r\n";

3
并且它必须是HTTP/1.1请求 - Maxim Krizhanovsky
正确的,给它点赞。只是出于好奇:现在是否有任何 Web 服务器会在请求为 1.0 时忽略该请求头? - Karoly Horvath
坦白地说,我不知道。但是当您发送正确的http版本时,您给Web服务器一个机会以505-不支持的响应进行回复。否则,如果您连接到的是http 1.0服务器,则可能会收到500或501响应,并且不知道该怎么办... - Maxim Krizhanovsky

1

您需要发送Host头来指定域名 - 一个服务器托管多个网站非常普遍:

$message = "GET /index.php HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

注意(正如{{link1:Darhazer}}所指出的那样),请求头“Host”仅在HTTP / 1.1中定义,因此您无法在HTTP / 1.0中使用。有可能使用绝对URL,例如:
$message = "GET http://www.example.com/index.php HTTP/1.0\r\n\r\n";

但这是违反 HTTP/1.0 的规定:

只有在请求发送到代理时,才允许使用 absoluteURI 形式。

而目标服务器显然不是代理,因此结果行为不可靠。


它必须是HTTP/1.1请求。 - Maxim Krizhanovsky
@Piskvor,谢谢你告诉我。今天我学到了一些东西。 - Javier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接