How do I get Apache's RewriteRule, Location, and PerlHander to work nicely together?

I have a the following Hello World mod_perl module:

  package Apache2::Alex::SemanticWeb;

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

  sub handler {

    my $r = shift;
    $r->content_type( 'text/html' );
    $r->print( 'hello, world!' );
    return Apache2::Const::OK;

  }

  1;

I then touch a file named semantic-web.cgi.

I then add a Location directive to httpd.conf:

  <Location /sandbox/semantic-web.cgi>
    SetHandler perl-script
    PerlHandler Apache2::Alex::SemanticWeb
  </Location>

I then use my browser to go to the following URL, and it returns "hello, world!":

  http://infomotions.com/sandbox/semantic-web.cgi

Great and wonderful.

I now want to implement a RewriteRule -- a la a "cool" linked data URL -- to redirect URLs with a specific shape to SemanticWeb.pm, and I use the following:

  RewriteRule ^/etexts/id/(.*) /sandbox/semantic-web.cgi?id=$1

In other words, all request starting with /etexts/id should be redirected (rewritten) to go to semantic-web.cgi. Unfortunately, all requests go directly to the touched file and not to my Perl package; the Location directive seems by-passed. When I remove semantic-web.cgi from my file system I get a 404 error (file not found).

What am I doing wrong? Does an actual file need to exist in order for mod_perl to find it? How should I edit httpd.conf so I can: 1) rewrite GET requests, and 2) execute the result in a mod_perl module?

--
Eric Lease Morgan
Infomotions, Inc.


Reply via email to