X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FCGI.pm;h=4c0d9b900717f7ce681199c4bf283723854acdc0;hb=99d93ba8704ef47d3477c7fbf1bd05fc24fce32e;hp=f00268bd9ad9ad9a4ca7521014280b089cb06fa4;hpb=eb3abf9698d6eb550497284482f36a315e856091;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/CGI.pm b/lib/Catalyst/Engine/CGI.pm index f00268b..4c0d9b9 100644 --- a/lib/Catalyst/Engine/CGI.pm +++ b/lib/Catalyst/Engine/CGI.pm @@ -157,7 +157,22 @@ sub prepare_path { if (my $req_uri = $ENV{REQUEST_URI}) { $req_uri =~ s/^\Q$base_path\E//; $req_uri =~ s/\?.*$//; - $path_info = $req_uri if $req_uri; + if ($req_uri) { + # Note that if REQUEST_URI doesn't start with a /, then the user + # is probably using mod_rewrite or something to rewrite requests + # into a sub-path of their application.. + # This means that REQUEST_URI needs information from PATH_INFO + # prepending to it to be useful, otherwise the sub path which is + # being redirected to becomes the app base address which is + # incorrect. + if (substr($req_uri, 0, 1) ne '/') { + my ($match) = $req_uri =~ m|^([^/]+)|; + my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|; + substr($req_uri, 0, length($match), $path_info_part) + if $path_info_part; + } + $path_info = $req_uri; + } } # set the request URI @@ -181,7 +196,7 @@ sub prepare_path { my $query = $ENV{QUERY_STRING} ? '?' . $ENV{QUERY_STRING} : ''; my $uri = $scheme . '://' . $host . '/' . $path . $query; - $c->request->uri( bless \$uri, $uri_class ); + $c->request->uri( bless(\$uri, $uri_class)->canonical ); # set the base URI # base must end in a slash