gpt4 book ai didi

http - 多个站点共享一个IP地址: I can't reach special site using Host header

转载 作者:可可西里 更新时间:2023-11-01 16:32:09 26 4
gpt4 key购买 nike

在我正在阅读的一本书中,作者展示了 HTTP header 的含义。即他说有服务器托管多个网站。

让我们这样做:

ping fideloper.com

我们可以看到IP地址:198.211.113.202。

现在让我们只使用 IP 地址:

curl -I 198.211.113.202

我们捕获了:

$ curl -I 198.211.113.202
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 03 Aug 2017 14:48:33 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://book.serversforhackers.com/

接下来让我们看看将 Host header 添加到 HTTP 请求时会发生什么:

$ curl -I -H "Host: fideloper.com" 198.211.113.202
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: max-age=86400, public
Date: Thu, 03 Aug 2017 13:23:58 GMT
Last-Modified: Fri, 30 Dec 2016 22:32:12 GMT
X-Frame-Options: SAMEORIGIN
Set-Cookie: laravel_session=eyJpdiI6IjhVQlk2UWcyRExsaDllVEpJOERaT3dcL2d2aE9mMHV4eUduSjFkQTRKU0R3PSIsInZhbHVlIjoiMmcwVUpNSjFETWs1amJaNzhGZXVGZjFPZ3hINUZ1eHNsR0dBV1FvdE9mQ1RFak5IVXBKUEs2aEZzaEhpRHRodE1LcGhFbFI3OTR3NzQxZG9YUlN5WlE9PSIsIm1hYyI6ImRhNTVlZjM5MDYyYjUxMTY0MjBkZjZkYTQ1ZTQ1YmNlNjU3ODYzNGNjZTBjZWUyZWMyMjEzYjZhOWY1MWYyMDUifQ%3D%3D; expires=Thu, 03-Aug-2017 15:23:58 GMT; Max-Age=7200; path=/; httponly
X-Fastcgi-Cache: HIT

这意味着 serversforhackers.com 是默认站点。

然后作者说我们可以在同一台服务器上请求Servers for Hackers:

$ curl -I -H "Host: serversforhackers.com” 198.211.113.202

书里这里收到HTTP/1.1 200 OK

但是我收到这个:

curl -I -H "Host: serversforhackers.com" 198.211.113.202
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 03 Aug 2017 14:55:14 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://book.serversforhackers.com/

嗯,作者组织了一个 301 重定向,现在使用 HTTPS。

我可以这样做:

curl -I https://serversforhackers.com

但这并不能说明什么是默认站点以及主机 header 如何寻址共享 IP 地址上的特殊站点的全部概念。

是否仍然有可能通过 IP 地址获得 200 Ok 寻址?

最佳答案

在 HTTP/1.1 中,没有 HTTPS,Host header 是唯一将主机名发送到服务器的地方。

使用 HTTPS,事情会更有趣。

首先,您的客户端通常会尝试根据预期名称检查服务器的 TLS 证书:

$ curl -I -H "Host: book.serverforhackers.com" https://198.211.113.202
curl: (51) SSL: certificate subject name (book.serversforhackers.com) does not match target host name '198.211.113.202'

大多数客户端提供了一种方法来覆盖此检查。 curl 有 -k/--insecure 选项:

$ curl -k -I -H "Host: book.serverforhackers.com" https://198.211.113.202
HTTP/1.1 200 OK
Server: nginx
[...]

但是还有第二个问题。我无法用您的示例服务器进行说明,但这是我在 Internet 上找到的一个:

$ curl -k -I https://analytics.usa.gov 
HTTP/1.1 200 OK
Content-Type: text/html
[...]

$ host analytics.usa.gov | head -n 1
analytics.usa.gov has address 54.240.184.142

$ curl -k -I -H "Host: analytics.usa.gov" https://54.240.184.142
curl: (35) gnutls_handshake() failed: Handshake failed

这是由 server name indication (SNI) 引起的— TLS (HTTPS) 的一项功能,主机名在 TLS 握手中发送。这是必要的,因为服务器需要提供正确的证书(用于正确的主机名)才能接收任何 HTTP header 。在上面的示例中,当我们使用 https://54.240.184.142 时,curl 没有发送正确的 SNI,服务器拒绝握手。其他服务器可能会接受连接,但会将其路由到错误的位置,Host header 最终将被忽略。

使用 curl,您不能像设置 Host header 那样使用单独的选项设置 SNI。 curl 将始终从请求 URL 中获取它。但是 curl 有一个特殊的 --resolve选项:

Provide a custom address for a specific host and port pair. Using this, you can make the curl requests(s) use a specified address and prevent the otherwise normally resolved address to be used. Consider it a sort of /etc/hosts alternative provided on the command line.

在这种情况下:

$ curl -I --resolve analytics.usa.gov:443:54.240.184.142 https://analytics.usa.gov
HTTP/1.1 200 OK
Content-Type: text/html
[...]

(443是HTTPS的标准TCP端口)

如果您想在较低级别进行实验,可以使用 openssl使用正确的 SNI 建立原始 TLS 连接的工具:

$ openssl s_client -connect 54.240.184.142:443 -servername analytics.usa.gov -crlf

然后您将能够输入 HTTP 请求并看到正确的响应:

HEAD / HTTP/1.1
Host: analytics.usa.gov

HTTP/1.1 200 OK
Content-Type: text/html
[...]

最后,请注意,在 HTTP/2 中,有一个名为 :authority 的特殊 header (是的,带有冒号),某些客户端可能会使用它来代替 Host .它们之间的区别是为了向后兼容 HTTP/1.1 和代理:参见 RFC 7540 § 8.1.2.3RFC 7230 § 5.3了解详情。

关于http - 多个站点共享一个IP地址: I can't reach special site using Host header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com