2016-02-10 34 views
1

我寫使用Perl的Mojolicious「框架,通過CORS臨危從其他Web服務器的請求的API,但是我無法提取的請求服務器的IP地址。Mojolicious/Perl - 從數據包中獲取IP?

X-Forwarded-For提取頭只給客戶端的IP地址? Perl或Mojolicious有沒有辦法從IP數據包本身提取源IP?

使用內置Mojolicious $self->tx->remote_address方法,因爲我的API Web服務器坐在後面Nginx上反向代理不起作用。

+0

看到https://stackoverflow.com/questions/24104937/logging-of-ip-address-transaction-id - 或會話ID功能於mojolog – neuhaus

+0

的REMOTE_ADDRESS函數返回客戶端IP,服務器調用我的API而不是IP地址。 – Caledonia91

+0

調用你的API的「服務器」是客戶端。 – neuhaus

回答

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; 
    }