如何在CGI脚本中访问HTTP标头请求?

CGI*_*ewb 20 perl cgi http-headers

我已经将Perl用于小型应用程序和测试代码,但我是网络和CGI的新手.

我得到了如何制作请求的标题(使用CGI.pm并打印header()函数的结果),但是无法找到有关如何访问发送到我的CGI脚本的标头的任何信息.有人能指出我正确的方向吗?

这可能是来自这样的请求:

curl http://127.0.0.1:80/cgi-bin/headers.cgi -H "HeaderAttribute: value"

mfo*_*ani 32

CGI模块具有http()可用于此目的的功能:

#!/usr/bin/perl --
use strict;
use warnings;
use CGI;

my $q = CGI->new;
my %headers = map { $_ => $q->http($_) } $q->http();

print $q->header('text/plain');
print "Got the following headers:\n";
for my $header ( keys %headers ) {
    print "$header: $headers{$header}\n";
}
Run Code Online (Sandbox Code Playgroud)

试试看; 以上给了我:

$ curl http://localhost/test.cgi -H "HeaderAttribute: value"
Got the following headers:
HTTP_HEADERATTRIBUTE: value
HTTP_ACCEPT: */*
HTTP_HOST: localhost
HTTP_USER_AGENT: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法打印逐字头名?即`x-some-header`而不是`HTTP_X_SOME_HEADER`? (2认同)

jir*_*ira 6

除了CGI.pm http()方法,您还可以从环境变量中获取HTTP头信息.

因此,如果您使用的是CGI :: Minimal,它没有http方法.你可以这样做:

  my $header = 'HTTP_X_REQUESTED_WITH';

  if (exists $ENV{$header} && lc $ENV{$header} eq 'xmlhttprequest') {
   _do_some_ajaxian_stuff();
  }
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 1

它们作为环境变量提供,例如

HTTP_HEADERATTRIBUTE=value
Run Code Online (Sandbox Code Playgroud)

不过,您可能需要做一些事情来配置您的网络服务器以提供这样的变量。