You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by mo...@normalperson.e4ward.com on 2010/02/01 14:10:17 UTC

rewrite url in modperl

Hello,

I have this modperl handler:

use Apache2::RequestRec ();
use Apache2::Connection ();
use Apache2::RequestUtil ();
use Apache2::ServerUtil ();
use Apache2::Log ();
use Apache2::Request ();

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

sub handler {

    my $r = shift;
    my $q = Apache2::Request->new($r);
    my $s = Apache2::ServerUtil->server;

    # get customer's ip
    my $ip = $r->connection->remote_ip;

    if ( is_valid_ip($ip) ){
        return Apache2::Const::OK;

    } else {
        $s->log_error("$ip FORBIDDEN");
        return Apache2::Const::FORBIDDEN;
    }
}


which verify the client's IP and return OK if ip is valid, otherwise
return FORBIDDEN.

Now I have to rewrite the requested url to another one, for example,

when customer requests:
http://example.com/path/12345_YWJjZGVmZw.mp4

the handler will remove the string after "_" (includes the "_"
itself), so the url will become:

http://example.com/path/12345.mp4

(because only 12345.mp4 is a real file on the filesystem,
12345_YWJjZGVmZw.mp4 is just virtual.)

How to implement that?

Thanks for your kind helps.

Re: rewrite url in modperl

Posted by Torsten Förtsch <to...@gmx.net>.
On Monday 01 February 2010 15:19:34 moli@normalperson.e4ward.com wrote:
> > Keep in mind that /path/12345.mp4 is still a valid URI and hence can be
> > requested by the browser. But you can check if the request is the result
> > of an internal redirect by checking $r->prev and deny it unless set.
> 
> That's a cool idea.
> But how to set it? I never used $r->prev in my before experience.
> 
you don't have to. apache does it for you.

When a request comes in $r->main and $r->prev are false. If it issues a 
subrequest $subrequest->main keeps $r so that the subrequest can modify the 
main one. Similar, if the main request is replaced by an internal_redirect() 
$redirectrequest->prev points to the main request in case you need something 
from there.

Torsten

Re: rewrite url in modperl

Posted by mo...@normalperson.e4ward.com.
2010/2/1 Torsten Förtsch <to...@gmx.net>:
> On Monday 01 February 2010 15:03:53 moli@normalperson.e4ward.com wrote:
>> 2010/2/1 Torsten Förtsch <to...@gmx.net>:
>> > If you don't want the browser to see the actual location of the mp4 file
>> > then you need $r->internal_redirect:
>> >
>> > use Apache2::SubRequest ();
>> > ...
>> >    if ( is_valid_ip($ip) ){
>> >        $r->internal_redirect('/path/12345.mp4');
>> >        return Apache2::Const::OK;
>>
>> Thank you Torsten, that's really what I expected.
>>
> Keep in mind that /path/12345.mp4 is still a valid URI and hence can be
> requested by the browser. But you can check if the request is the result of an
> internal redirect by checking $r->prev and deny it unless set.
>

That's a cool idea.
But how to set it? I never used $r->prev in my before experience.
Thanks again.

Re: rewrite url in modperl

Posted by Torsten Förtsch <to...@gmx.net>.
On Monday 01 February 2010 15:03:53 moli@normalperson.e4ward.com wrote:
> 2010/2/1 Torsten Förtsch <to...@gmx.net>:
> > If you don't want the browser to see the actual location of the mp4 file
> > then you need $r->internal_redirect:
> >
> > use Apache2::SubRequest ();
> > ...
> >    if ( is_valid_ip($ip) ){
> >        $r->internal_redirect('/path/12345.mp4');
> >        return Apache2::Const::OK;
> 
> Thank you Torsten, that's really what I expected.
> 
Keep in mind that /path/12345.mp4 is still a valid URI and hence can be 
requested by the browser. But you can check if the request is the result of an 
internal redirect by checking $r->prev and deny it unless set.

Torsten

Re: rewrite url in modperl

Posted by mo...@normalperson.e4ward.com.
2010/2/1 Torsten Förtsch <to...@gmx.net>:

> If you don't want the browser to see the actual location of the mp4 file then
> you need $r->internal_redirect:
>
> use Apache2::SubRequest ();
> ...
>    if ( is_valid_ip($ip) ){
>        $r->internal_redirect('/path/12345.mp4');
>        return Apache2::Const::OK;
>

Thank you Torsten, that's really what I expected.

Re: rewrite url in modperl

Posted by Torsten Förtsch <to...@gmx.net>.
On Monday 01 February 2010 14:10:17 moli@normalperson.e4ward.com wrote:
> I have this modperl handler:
> 
> use Apache2::RequestRec ();
> use Apache2::Connection ();
> use Apache2::RequestUtil ();
> use Apache2::ServerUtil ();
> use Apache2::Log ();
> use Apache2::Request ();
> 
> use Apache2::Const -compile => qw(OK FORBIDDEN);
> 
> sub handler {
> 
>     my $r = shift;
>     my $q = Apache2::Request->new($r);
>     my $s = Apache2::ServerUtil->server;
> 
>     # get customer's ip
>     my $ip = $r->connection->remote_ip;
> 
>     if ( is_valid_ip($ip) ){
>         return Apache2::Const::OK;
> 
>     } else {
>         $s->log_error("$ip FORBIDDEN");
>         return Apache2::Const::FORBIDDEN;
>     }
> }
> 
> 
> which verify the client's IP and return OK if ip is valid, otherwise
> return FORBIDDEN.
> 
> Now I have to rewrite the requested url to another one, for example,
> 
> when customer requests:
> http://example.com/path/12345_YWJjZGVmZw.mp4
> 
> the handler will remove the string after "_" (includes the "_"
> itself), so the url will become:
> 
> http://example.com/path/12345.mp4
> 
> (because only 12345.mp4 is a real file on the filesystem,
> 12345_YWJjZGVmZw.mp4 is just virtual.)
> 
> How to implement that?
> 
I think you know you can return Apache2::Const::REDIRECT or 
Apache2::Const::HTTP_SEE_OTHER along with a location header and have the 
browser do the redirect. But I think that is not what you want, right?

If you don't want the browser to see the actual location of the mp4 file then 
you need $r->internal_redirect:

use Apache2::SubRequest ();
...
    if ( is_valid_ip($ip) ){
        $r->internal_redirect('/path/12345.mp4');
        return Apache2::Const::OK;

Torsten