【问题标题】:Mojolicious / Perl - Getting IP from packet?Mojolicious / Perl - 从数据包中获取 IP?
【发布时间】:2020-05-25 03:41:23
【问题描述】:

我使用 Perl 'Mojolicious' 框架编写了一个 API,它通过 CORS 接收来自其他 Web 服务器的请求,但是我无法提取请求服务器的 IP 地址。 p>

提取像X-Forwarded-For 这样的标头只给出客户端的IP 地址? Perl 或 Mojolicious 中是否有任何方法可以从 IP 数据包本身中提取源 IP?

使用内置 Mojolicious $self->tx->remote_address 方法不起作用,因为我的 API Web 服务器位于 Nginx 反向代理后面。

【问题讨论】:

  • remote_address函数返回客户端IP,而不是调用我的API的服务器IP。
  • 调用您的 API 的“服务器”是客户端。
  • 实际上现在显示的是 127.0.0.1,可能是因为我的 API Web 服务器运行在 Nginx 后面。
  • 你需要配置 nginx 将真实的客户端 IP 地址粘贴到其他环境变量中

标签: api perl mojolicious


【解决方案1】:

我使用自己的助手src_addr:

use Net::IP::Lite;

$app->helper( src_addr => sub {
  my $c = shift;
  my $xff = $c->req->headers->header('X-Real-IP') // $c->req->headers->header('X-Forwarded-For') // '';

  if($xff) {
    for my $ip (reverse split(/[\s,]+/, $xff)) {
      next if ! ip_validate($ip);
      return $ip;
    }
  }
  return $c->tx->remote_address;
});

在 nginx 中:

    location / {
            proxy_read_timeout 300;
            proxy_pass http://localhost4:54329/;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto "https";
            proxy_set_header X-Forwarded-HTTPS 1;
    }

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 2021-06-18
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2017-08-25
    • 2011-05-31
    相关资源
    最近更新 更多