【问题标题】:Who is wrong about the http://0:port?谁对 http://0:port 有误?
【发布时间】:2015-09-23 09:56:18
【问题描述】:

Plack 套件通常使用http://0:port。例如。以下

plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");'

打印

HTTP::Server::PSGI: Accepting connections at http://0:5000/

但是,LWP::UserAgent(或一些更深层次的模块)不接受它,例如该:

perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://0:5000/valid/path");print $res->status_line'

打印:

500 No Host option provided

但是

perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://localhost:5000/valid/path");print $res->status_line'

打印

200 OK

问题是:谁错了?

  • http://0:port 是否有效,例如LWP 是“错误的”
  • 或者它是无效的并且 PSGI 使用它作为唯一的“随机有效”快捷方式?

【问题讨论】:

  • 本地主机不是地址0,它(通常)是127.0.0.1。尝试 ping localhost 以查看实际地址。
  • @JoachimPileborg 好的,编辑了问题标题。 :) 问题的优点仍然存在:网址http://0:5000 是否有效?可以/应该使用还是不使用?
  • Address 0 是服务器在侦听来自所有接口的连接时使用的通配符地址。尝试连接它是没有意义的。

标签: perl lwp psgi


【解决方案1】:

Plack 套件的输出是服务器的输出。服务器通常binds 到某个端口和地址的套接字,以便在那里提供内容。 在这种情况下,符号http://0:port 表示:listen 在此机器的所有地址上的端口port。如果您不知道或不想指定应该可以访问服务器的机器的所有地址,这会很方便。

LWP::UserAgent 的输出是客户端的输出。为了打开与服务器的连接,您必须明确指定地址要连接的端口。 0 不是有效的 IP 地址,因此当您将 connect 连接到 http://0:port 时连接失败。

【讨论】:

  • http://0:port 是一个 URL。所以,http://0:5000 不是有效的 URL,它是“唯一的”handy。对吗?
  • 它不是有效的 URL。这只是 Plack 代码中某处 printf 的结果。服务器不绑定到 URL,而是绑定到 IP 地址和端口的组合。
  • 好的,理解绑定 - 但是 PSGI 会打印一个 URL,例如http://0:5000 。好的 - 现在知道了 - 它会打印一个无效的 URL,但在许多情况下它很方便 - 许多浏览器只是将其转换为 127.0.0.1。谢谢。 :)
  • 虽然答案是正确的,但它应该包含:打印的 URL 无效。 (恕我直言,使用http://*:5000 会更清楚 - 但它不如0:5000 方便。:) 无论如何+1 :)
【解决方案2】:

Safari 11、curl 和 wget 将 http://0:5000 解析为 http://0.0.0.0:5000 并连接到 localhost。

我刚刚测试了一下,看到网址后发现问题的答案不满意。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2018-10-11
    • 2020-05-12
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2023-04-03
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多