如何在基于HTML::Mason的Perl网站中获取完整请求URI?
在HTML::Mason中获取完整请求URI及协议的方法
一、获取请求协议(http/https)
在HTML::Mason的mod_perl环境里,$r是Apache请求对象,判断协议有两种实用方式:
- 直接检查SSL状态:调用
$r->is_https方法,返回真则为HTTPS,否则为HTTP:my $protocol = $r->is_https ? 'https' : 'http'; - 如果网站部署在反向代理(如Nginx)之后,后端服务器拿到的是HTTP请求,此时需要读取代理传递的头信息获取真实协议:
my $protocol = $r->headers_in->{'X-Forwarded-Proto'} || ($r->is_https ? 'https' : 'http');
二、获取完整请求URI
完整URI需要手动拼接协议+主机名+路径及查询参数——因为$r->uri和$r->unparsed_uri只返回路径相关部分,不包含协议和主机:
- 按上面的方法获取协议
- 获取主机名:用
$r->hostname或$r->server->server_hostname获取请求的主机名 - 获取路径及查询参数:
$r->unparsed_uri会返回原始请求中的路径和查询参数部分(比如/page?foo=bar) - 拼接完整URI:
my $protocol = $r->is_https ? 'https' : 'http'; my $hostname = $r->hostname; my $path_query = $r->unparsed_uri; my $full_uri = "$protocol://$hostname$path_query";
补充说明
$r->uri:返回经过Apache解析后的路径(不含查询参数),比如请求/page?foo=bar时只返回/page$r->unparsed_uri:返回原始请求行中的URI部分,包含路径和查询参数,但不包含协议和主机名
内容的提问来源于stack exchange,提问作者Dina
相关产品推荐
相关产品推荐

