如何使用mod_perl发送自定义的HTTP状态代码



我已经写了 cgi 程序,然后我将HTTP标头的状态错误发送给客户端。但是,当我尝试使用 mod_perl 时,它只响应200个确定状态。如何发送自定义状态代码?

这是我想响应自定义状态错误时的代码:

my $cgi      = new CGI;
print $cgi->header(-type=>"text/html", -charset=>'utf-8', -status=>599);

编辑
这是代码:

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

my $cgi      = new CGI;
my $method = $cgi->param("method");
my $sessionManagement = new SessionManagement(cgi=>$cgi);
if($sessionManagement){
  if (defined($method)) {
    if($method eq "authentication") {
        loginMethod($cgi,$sessionManagement);
    } elsif ($method eq "someMethod"){
        someMethod($cgi);
    } else{
        print $cgi->header(-type=>"text/xml", -charset=>'utf-8');
        print "<html>method does not exist</html>";
    }
  } else {
      print $cgi->header(-type=>"text/html", -charset=>'utf-8' , -status=>599);
      print "<html>blah blah</html>";
  }
}else{
  print $cgi->header(-type=>"text/html", -charset=>'utf-8' , -status=>599);
  print "<html>blah blah</html>";
}

编辑2

提供更多信息:当我在shell中使用 curl -v 192.168.1.212/mymodperl/test.pl命令时。
这是响应:

* About to connect() to 192.168.1.212 port 80 (#0)
*   Trying 192.168.1.212... connected
* Connected to 192.168.1.212 (192.168.1.212) port 80 (#0)
> GET /mymodperl/test.pl HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 192.168.1.212
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 25 Nov 2017 11:04:18 GMT
< Server: Apache/2.2.15 (Red Hat)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=ISO-8859-1
< 
<html>hi</html><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
 root@localhost and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
<hr>
<address>Apache/2.2.15 (Red Hat) Server at 192.168.1.212 Port 80</address>
</body></html>
* Closing connection #0

来自http://www.perlmonks.org/?node_id=826769,设置状态代码的方法是

package My::Handler;
use strict;
use warnings 'all';
use Apache2::RequestRec;
sub handler : method {
  my ($class, $r) = @_;
  $r->status( 401 );
  return 401;
}
1;# return true:

编辑:澄清

来自https://perl.apache.org/docs/2.0/user/handlers/intro.html

什么是处理程序?

apache区分了它提供钩子的许多阶段(因为C函数称为ap_hook_),其中模块可以插入各种回调以扩展和更改WebServer的默认行为。MOD_PERL为大多数可用挂钩提供了PERL接口,因此MOD_PERL模块作者可以更改Perl中的Apache行为。这些回调通常称为处理程序,因此MOD_PERL处理程序的配置指令看起来像:PerlfooHandler,其中FOO是处理程序名称之一。例如,perlresponsehandler配置响应回调。

典型的处理程序只是带有处理程序子例程的Perl软件包。例如:

file:MyApache2/CurrentTime.pm
----------------------------
package MyApache2::CurrentTime;
use strict;
use warnings;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Const -compile => qw(OK);
sub handler {
  my $r = shift;
  $r->content_type('text/plain');
  $r->print("Now is: " . scalar(localtime) . "n");
  return Apache2::Const::OK;
}
1;

此处理程序只需返回当前日期和时间作为响应。

由于这是响应处理程序,因此我们将其配置为httpd.conf:

PerlResponseHandler MyApache2::CurrentTime

由于应为特定位置配置响应处理程序,让我们编写一个完整的配置部分:

PerlModule MyApache2::CurrentTime
<Location /time>
  SetHandler modperl
  PerlResponseHandler MyApache2::CurrentTime
</Location>

现在,当请求向http://localhost/time发出请求时,该响应处理程序被执行并包含当前时间的响应退还给客户端。

相关内容

  • 没有找到相关文章

最新更新