在远程服务器 上remote1.myorg.io
,我无法访问 Web 资源,例如http://spaa.acm.org/2020/SPAA2020TutorialProgram.pdf
。因此,在远程服务器上,我使用 ssh 在 127.0.0.0 上创建一个服务器,并通过将请求转发回我的本地计算机(并让我的本地计算机获取资源)来访问资源。这就是我在本地计算机上所做的事情:
ssh -R 6050:spaa.acm.org:80 remote1.myorg.io
然后 remote1.myorg.io
,我就
curl -v http://localhost:6050/2020/SPAA2020TutorialProgram.pdf
但是,我得到
* About to connect() to localhost port 6050 (#0)
* Trying ::1...
* Connected to localhost (::1) port 6050 (#0)
> GET /2020/SPAA2020TutorialProgram.pdf HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:6050
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Connection: Keep-Alive
< Content-Type: text/html
< Transfer-Encoding: chunked
< Date: Sun, 15 Nov 2020 00:41:45 GMT
< Server: LiteSpeed
<
我究竟做错了什么?
答案1
问题:spaa.acm.org 服务器与许多 Web 服务器一样,执行类似于基于名称的虚拟托管之类的操作。也就是说,它检查Host
传入请求的标头,并可以根据客户端试图访问的主机名提供不同的内容。如果您查看 的详细输出curl
,它包含以下标头:
> Host: localhost:6050
...但我很确定服务器无法识别“localhost”作为它应该服务的域名,所以你会遇到问题。
解决方案 1:您可以curl
获取普通 URL(包括“spaa.acm.org”域),但通过 localhost:6050 代理连接:
curl -v -x localhost:6050 http://spaa.acm.org/2020/SPAA2020TutorialProgram.pdf -O
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 6050 (#0)
> GET http://spaa.acm.org/2020/SPAA2020TutorialProgram.pdf HTTP/1.1
> Host: spaa.acm.org
> User-Agent: curl/7.54.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK
< Connection: Keep-Alive
< Content-Type: application/pdf
< Last-Modified: Sat, 11 Jul 2020 07:33:05 GMT
< Etag: "168eb-5f096b31-3718a48ea4a1f404;;;"
< Accept-Ranges: bytes
< Content-Length: 92395
< Date: Sun, 15 Nov 2020 01:24:27 GMT
< Server: LiteSpeed
<
(注意Host: spaa.acm.org
标题。)
解决方案 2:显式覆盖Host
标头:
curl -v -H "Host: spaa.acm.org" http://localhost:6050/2020/SPAA2020TutorialProgram.pdf -O
我不会在其中包含调试输出,足以说明它也可以工作。