Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: ModPerl: ModPerl

rewriterule, location, and perlhandler

 

 

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded


eric_morgan at infomotions

Jul 21, 2009, 6:32 PM

Post #1 of 8 (1430 views)
Permalink
rewriterule, location, and perlhandler

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.


wellnhofer at aevum

Jul 21, 2009, 6:45 PM

Post #2 of 8 (1373 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

Eric Lease Morgan wrote:
> What am I doing wrong? Does an actual file need to exist in order for
> mod_perl to find it?

No.

> How should I edit httpd.conf so I can: 1) rewrite
> GET requests, and 2) execute the result in a mod_perl module?

Try the mod_rewrite "passthrough" (PT) flag:

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

More info here:
http://modperlbook.org/html/12-8-mod_rewrite-Examples.html

Nick


eric_morgan at infomotions

Jul 21, 2009, 6:53 PM

Post #3 of 8 (1384 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

On Jul 21, 2009, at 9:45 PM, Nick Wellnhofer wrote:

>> What am I doing wrong? Does an actual file need to exist in order for
>> mod_perl to find it?
>
> No.


I didn't think so, but what sort of configuration do I need to do so
my mod_perl packages get executed without the existence of a file?

--
Eric Morgan


adam.prime at utoronto

Jul 21, 2009, 9:05 PM

Post #4 of 8 (1368 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

Eric Lease Morgan wrote:
>
> On Jul 21, 2009, at 9:45 PM, Nick Wellnhofer wrote:
>
>>> What am I doing wrong? Does an actual file need to exist in order for
>>> mod_perl to find it?
>>
>> No.
>
>
> I didn't think so, but what sort of configuration do I need to do so my
> mod_perl packages get executed without the existence of a file?
>

You need to use Handlers. See this link for a really simple example of
a ResponseHandler, and how to configure it.

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Handler_Modules

Adam


eric_morgan at infomotions

Jul 22, 2009, 6:38 AM

Post #5 of 8 (1371 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

On Jul 22, 2009, at 12:05 AM, Adam Prime wrote:

>>>> <Location /sandbox/semantic-web.cgi>
>>>> SetHandler perl-script
>>>> PerlHandler Apache2::Alex::SemanticWeb
>>>> </Location>
>>>>
>>>> What am I doing wrong? Does an actual file need to exist in order
>>>> for
>>>> mod_perl to find it?
>>>
>>> No.
>>
>> I didn't think so, but what sort of configuration do I need to do
>> so my
>> mod_perl packages get executed without the existence of a file?
>
> You need to use Handlers. See this link for a really simple example
> of
> a ResponseHandler, and how to configure it.
>
> http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Handler_Modules


By first changing my Location directive to the following:

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

And then changing my RewriteRule to this:

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

I eliminate the need to have a file on my file system.

Thank you. oss++ * mailing_lists++

--
Eric Lease Morgan


adam.prime at utoronto

Jul 22, 2009, 6:59 AM

Post #6 of 8 (1366 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

Eric Lease Morgan wrote:
>
> On Jul 22, 2009, at 12:05 AM, Adam Prime wrote:
>
> By first changing my Location directive to the following:
>
> <Location /sandbox/semantic-web/>
> SetHandler perl-script
> PerlHandler Apache2::Alex::SemanticWeb
> </Location>
>
> And then changing my RewriteRule to this:
>
> RewriteRule ^/etexts/id/(.*) /sandbox/semantic-web/?id=$1 [passthrough]
>
> I eliminate the need to have a file on my file system.
>
> Thank you. oss++ * mailing_lists++
>

If you want, it's actually possible to take this even further and remove
rewrite completely.

<Location /etexts/id/>
SetHandler perl-script
PerlHandler Apache2::Alex::SemanticWeb
</Location>

Then alter your handler's code to parse $r->uri and extract everything
after $r->location. (or you can use $r->path_info, if the /etexts/id/
actually exists in your document root). That'll give you the same thing
that rewrite is currently stuffing into your id argument.

Adam


torsten.foertsch at gmx

Jul 22, 2009, 7:27 AM

Post #7 of 8 (1378 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

On Wed 22 Jul 2009, Adam Prime wrote:
> Eric Lease Morgan wrote:
> > On Jul 22, 2009, at 12:05 AM, Adam Prime wrote:
> >
> > By first changing my Location directive to the following:
> >
> > <Location /sandbox/semantic-web/>
> > SetHandler perl-script
> > PerlHandler Apache2::Alex::SemanticWeb
> > </Location>
> >
> > And then changing my RewriteRule to this:
> >
> > RewriteRule ^/etexts/id/(.*) /sandbox/semantic-web/?id=$1
> > [passthrough]
> >
> > I eliminate the need to have a file on my file system.
> >
> > Thank you. oss++ * mailing_lists++
>
> If you want, it's actually possible to take this even further and
> remove rewrite completely.
>
> <Location /etexts/id/>
> SetHandler perl-script
> PerlHandler Apache2::Alex::SemanticWeb
> </Location>
>
> Then alter your handler's code to parse $r->uri and extract
> everything after $r->location. (or you can use $r->path_info, if the
> /etexts/id/ actually exists in your document root). That'll give you
> the same thing that rewrite is currently stuffing into your id
> argument.

Never use path_info unless you are very sure it is what you want.
Path_info is made for CGI scripts where $r->filename points to the file
containing the script.

The usage of path_info leads to action at a distance problems. Assume
you have an empty directory DOCROOT/etexts/id and path_info s what you
want. Later an administrator adds a file or subdirectory to that
directory or removes the id directory. Suddenly path_info has changed
but the handler and all libraries it uses are still the same.

substr($r->uri, length $r->location) is almost always what you need.

Torsten

--
Need professional mod_perl support?
Just hire me: torsten.foertsch [at] gmx


eric_morgan at infomotions

Jul 22, 2009, 7:39 AM

Post #8 of 8 (1374 views)
Permalink
Re: rewriterule, location, and perlhandler [In reply to]

On Jul 22, 2009, at 10:27 AM, Torsten Foertsch wrote:

>> If you want, it's actually possible to take this even further and
>> remove rewrite completely.
>>
>> <Location /etexts/id/>
>> SetHandler perl-script
>> PerlHandler Apache2::Alex::SemanticWeb
>> </Location>
>>
>> Then alter your handler's code to parse $r->uri and extract
>> everything after $r->location. (or you can use $r->path_info, if the
>> /etexts/id/ actually exists in your document root). That'll give you
>> the same thing that rewrite is currently stuffing into your id
>> argument.
>
> Never use path_info unless you are very sure it is what you want.
> Path_info is made for CGI scripts where $r->filename points to the
> file
> containing the script....
>
> substr($r->uri, length $r->location) is almost always what you need.


These two things represent a very elegant solution that I have already
implemented. Cool. Thanks!

--
Eric Lease Morgan

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.