如何让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
相关产品推荐
相关产品推荐

