为什么原始站点可以运行,但端口转发到同一站点却失败?

为什么原始站点可以运行,但端口转发到同一站点却失败?

最终我想端口转发 HTTP 连接。对链接问题中的命令进行故障排除,我尝试了这个:

ssh -L localhost:8888:www.google.com:80 -N localhost

如果我现在使用相同的浏览器访问,localhost:8888我会得到 404 错误,而不是 Google 主页。访问其他网站时,我会得到其他类型的错误。

我在这里遗漏了什么?这不是一个简单的端口转发吗?TCP 层以上的所有内容不应该都相同吗?显然不是。

所以:

  1. 我错过了什么?
  2. 还有其他可以起作用的命令吗?

答案1

你缺少什么

HTTP(s) 客户端将告诉服务器它用来访问它的名称(例如允许同一台服务器托管具有不同名称的多个站点)。

因此,如果客户说www.google.com

Hi www.google.com, please serve your home page

可以。但如果客户说www.google.com

Hi localhost, please serve your home page

那么服务器就不太明白你的意思,因为没有本地主机网络服务器位于那里。

替代命令

您需要伪造客户端随 HTTP 请求发送的“Host:”标头。否则,将使用 URL 中的主机名。以下是几个示例:

wget --header="Host: www.google.com" http://localhost:8888/

或者

curl --header "Host: www.google.com" http://localhost:8888/

答案2

由于基于名称的虚拟主机如今非常流行,因此端口转发和 HTTP/HTTPS 不能很好地混合。

通过 SSH 进行端口转发仅使主机名localhost在端口上可用8888

如果另一端的应用程序google.com未设置为响应localhost主机名,则会失败并出现 404。

许多网站(从小型到大型)都将 Web 服务器绑定到主机名而不是 IP 地址。在 Apache 中,这称为基于名称的虚拟主机。基于名称的虚拟主机设置的好处是允许多个主机名(与多个网站/应用程序关联)通过同一 IP 地址访问这些多个网站/应用程序。

简单来说,如果您在共享服务器上获得个人网络托管计划,那么您的网站就可以与同一台机器上具有相同 IP 地址的数十个其他网站一起提供服务。

虽然我不知道 Google 使用什么网络服务器软件,但它似乎是基于主机名进行绑定的。

因此,当您转到localhost:8888该页面时,会向 Google 发送请求,表示您正在请求主机名的数据localhost。而 Google 方面基本上会说:“不!不知道您想要什么localhost;我们这里没有这个!”因此会出现 404 错误。

也就是说,如果您想尝试本地端口转发,您最好在开发机器上设置一个测试 Web 服务器,无论主机名是什么,该服务器都将提供内容 - 通过将该网站设为“默认”配置 - 然后测试在本地通过不同的端口访问该网站。

就我的经验而言,端口转发的主要好处是,当您的管理员未在您连接的任何盒子上打开默认端口时,您能够在本地连接到非 Web 项目的远程端口。查看许多带有 GUI 的 MySQL 连接工具,总会有一个 SSH 选项,允许您通过 SSH 连接,但可以在桌面上访问数据库。

相关内容