Re: How Do I change the Document Root Per Request

Lathan Bidwell <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <CAOqPvqj6h_QpA_UyjcmtABSBftX+kxemiMS5UBRFCb4wcBqYDQ@mail.gmail.com>
David,

I am not an expert at this, so I don't have an answer.

But I can suggest a few debugging steps to clear out of the way:

1) Confirm that your document root is showing properly in the error log

Does the error log report "/var/html/foo/bar.html" is not found, or does it
only show the request? On my local apache instance if I do /blah/foo (non
existant), I get: File does not exist: /home/www/html/blah (which has my
document root in it).

2) Confirm that path exists, Look for a folder structure you can create
that will work

if /var/html/foo/bar.html doesn't exist, is it looking for
/var/www/foo/bar.html or /foo/bar.html

3) Do you have any rewrite urls or other location / directory directives
that could be overriding hits?

Check your config files, and then put in some print STDERR / smart comments
to confirm if your routing program is returning the DECLINED

4) Does it work for DirectoryIndexes?

Lathan

On Wed, Mar 11, 2015 at 12:59 PM, David E. Wheeler <[email protected]>
wrote:

> On Mar 6, 2015, at 5:29 PM, David E. Wheeler <[email protected]>
> wrote:
>
> > And now it works just how I want.
>
> I take it back. It works for files in the root, but not subdirectories.
>
> So say my document root is /var/html, and a request comes in for
> /foo/bar.html. Apache has mapped it to /var/html/foo/bar.html, but in my
> PerlTypeHandler, I re-map it to /var/html/david/foo/bar.html and set finfo:
>
>   sub handler {
>       my $r = shift;
>
>       # We only want to do this once per request.
>       return DECLINED unless $r->is_initial_req;
>
>       # Get the username.
>       my $user = $r->user or return HTTP_UNAUTHORIZED;
>
>       # Return forbidden if the subscriber ID subdirectory does not exist.
>       my $doc_root = $r->document_root;
>       my $sub_root = File::Spec->catdir($doc_root, $user);
>       return HTTP_FORBIDDEN unless -d $sub_root;
>
>       # Set the filename.
>       my $file = File::Spec->catfile($sub_root, substr $r->uri, 1);
>       $r->filename($file);
>       $r->finfo(APR::Finfo::stat($file, APR::Const::FINFO_NORM, $r->pool));
>       return DECLINED;
>  }
>
> I have no PerlReponseHandler, so Apache handles the response…and returns
> 404. Note that a request for /hi.txt; it’s only a request in a
> subdirectory, /foo/bar.html, that fails. Why? Why isn’t Apache able to find
> that file? Is there some other attribute of $r I need to set or unset?
>
> Thanks,
>
> David
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.