You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Mojolicious的Mojo::UserAgent仅使用IPv4?

配置Mojo::UserAgent仅使用IPv4的方法

要让Mojo::UserAgent仅使用IPv4网络(类似wget --inet4-only的效果),可以通过以下几种方式实现:

方法一:设置全局环境变量(最简便)

Mojolicious内置了MOJO_NO_IPV6环境变量,设置后会全局禁用IPv6支持,所有网络操作(包括Mojo::UserAgent)都会默认使用IPv4。

两种设置方式:

  • 运行脚本前设置:
    export MOJO_NO_IPV6=1
    perl your_script.pl
    
  • 在代码中设置:
    在创建Mojo::UserAgent对象前添加以下代码:
    $ENV{MOJO_NO_IPV6} = 1;
    use Mojo::UserAgent;
    
    my $ua = Mojo::UserAgent->new;
    # 后续使用$ua发起请求
    

方法二:针对单个UA实例配置(精细控制)

如果不需要全局禁用IPv6,仅想让特定的Mojo::UserAgent实例使用IPv4,可以通过自定义连接回调,强制socket使用IPv4协议族:

use Mojo::UserAgent;
use Socket qw(AF_INET);

my $ua = Mojo::UserAgent->new;

# 绑定当前UA实例仅使用IPv4
$ua->transactor->on(connect => sub {
  my ($transactor, $handle) = @_;
  # 指定socket使用IPv4协议族
  $handle->configure({ Domain => AF_INET });
});

# 测试请求
my $response = $ua->get('https://blabli.com')->result;
print $response->body if $response->is_success;

原理说明

Mojolicious的网络底层基于IO::Socket::IP,设置Domain => AF_INET会强制socket仅处理IPv4地址,DNS解析时也只会返回IPv4的A记录,避免尝试IPv6连接。

方法三:自定义DNS解析(仅查询IPv4记录)

通过修改Mojo::DNS的解析行为,强制只查询IPv4的A记录,不获取IPv6的AAAA记录:

use Mojo::UserAgent;
use Mojo::DNS;

# 创建自定义DNS解析器,仅查询A记录
my $dns = Mojo::DNS->new;
$dns->on(resolve => sub {
  my ($dns, $question, $callback) = @_;
  $question->{type} = 'A'; # 强制查询IPv4记录
  $dns->SUPER::resolve($question, $callback);
});

# 将自定义DNS绑定到UA实例
my $ua = Mojo::UserAgent->new(dns => $dns);

这种方法适合需要更精细控制DNS解析逻辑的场景,但相对前两种方式复杂度更高。

内容的提问来源于stack exchange,提问作者Michael2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:21:11