jfroebe has asked for the wisdom of the Perl Monks concerning the following question:

mod_perl 2, apache 2, On Fedora Core 5

In my perl-HTML-Mason.conf:

PerlOptions +GlobalRequest PerlModule Apache2::Request PerlModule Apache2::Const PerlSetVar MasonArgsMethod mod_perl .... <FilesMatch "(\.mas|handler)$"> SetHandler perl-script PerlHandler "sub { return Apache2::Const::NOT_FOUND; }" </FilesMatch> <FilesMatch "^(\.)"> SetHandler perl-script PerlHandler "sub { return 404; }" </FilesMatch>
===========

Problem: 

I want to send a 404 (not found) error back to the browser when any ".*" or "*.mas" or "*handler" files are requested.  The example in the Mason book is for mod_perl v1 and so far, I haven't been able to find a working example of how to send the 404 return code using Apache2::Const in an apache .conf file. 

Has anyone gotten this to work?

thanks :)

Update:

I got it to work by removing the "PerlModule Apache2::Const" line and loading the module directly in the anonymous subroutine. Thanks to perrin for pointing out the PerlResponseHandler (PerlHandler is deprecated in mod_perl 2).

<FilesMatch "(\.mas|handler)$"> SetHandler perl-script PerlResponseHandler "sub { use Apache2::Const; return Apache2::Con +st::NOT_FOUND }" </FilesMatch>

Jason L. Froebe

Team Sybase member

No one has seen what you have seen, and until that happens, we're all going to think that you're nuts. - Jack O'Neil, Stargate SG-1

Replies are listed 'Best First'.
Re: Perl Mason & Apache: getting Apache2::Const to work
by perrin (Chancellor) on Sep 11, 2006 at 20:32 UTC
    Don't return a literal 404. The return from a PerlResponseHandler (PerlHandler is an alias and should work) is supposed to be a constant that the apache server understands, so it should be Apache2::Const::NOT_FOUND. What you have for .mas files looks fine. Is it not working for you?

      Thanks :)

      The subroutine for the .mas files actually fails with the following error message:

      Argument "Apache2::Const::NOT_FOUND" isn't numeric.

      Throwing a sprintf() around it won't work because of the limited parsing available of the perl code in the apache config file. :( The Apache2::Const::NOT_FOUND is the number 404 so returning either one should result in the same way.

      #!/usr/bin/perl use strict; use warnings; use Apache2::Const; printf "%d\n", Apache2::Const::NOT_FOUND;

      Results in:

      404

      Jason L. Froebe

      Team Sybase member

      No one has seen what you have seen, and until that happens, we're all going to think that you're nuts. - Jack O'Neil, Stargate SG-1

        It is 404 now, but that's subject to change at any time in any future apache release, so don't hardcode 404.

        I think you need to add this before using the constant:

        use Apache2::Const -compile => qw(NOT_FOUND);