On Mon, Feb 13, 2012 at 11:35 AM, Hridayesh Gupta
<hridayeshi...@gmail.com> wrote:
> I have the following rule in conf file at server.com
>
> RewriteEngine On
> RewriteRule /source(.*) http://example.com/target$1 [P]
> ProxyRequests Off
> ProxyPassReverse /source http://example.com/target
>
> http://example.com/target/a.php redirects to http://example.com/target/b.php
> http://example.com/target redirects to http://example.com/target/
>
> When I visit http://server.com/source/a.php , it redirects correctly to
> http://server.com/source/b.php which will serve the content from
> http://example.com/target/b.php as defined in rewriterule, But when I visit
> http://server.com/source , it does not redirect to http://server.com/source/
> instead it redirects to http://server.com/target/
> The above worked correctly on my local machine Apache 2.2.14/Ubuntu with
> same setting.
>
> I also have checked Location header using firbug while visiting
> http://example.com/target and http://example.com/target/a.php and in both
> cases Location header string is full url eg http://example.com/target/ and
> http://example.com/b.php
>
> So In my understanding ProxyPassReverse is not substituting Location header
> correctly in Apache 2.2.4/CentOS
>
> Please help me for this issue. Please let me for any further information.
>
> Thank you

You seem to be very confused about rewriting and proxying. First of
all, when you wish to do proxying like in your example, you do not use
a RewriteRule. You wrote:

RewriteRule /source(.*) http://example.com/target$1 [P]

This is equivalent to:

ProxyPass /source http://example.com/target

You're also proxying stuff you probably didn't intend either - eg
/source-wibble will get proxied to http://example.com/target-wibble.
It's best to include a trailing '/' where it is appropriate:

ProxyPass /source/ http://example.com/target/

In fact, it is easier to combine all of this into a Location block:

<Location /source/>
  ProxyPass http://example.com/target/
  ProxyPassReverse http://example.com/target/
</Location>

which is equivalent to your config.

Now, your question is "why doesn't ProxyPassReverse do what I was
expecting". You have:

ProxyPassReverse /source http://example.com/target

What this means is that when a response is received by apache from the
http://example.com/target backend with a Location header, it will
rewrite it. If the location header says "http://example.com/target/b";,
then it will get rewritten to "/source/b", and then turned into a
absolute URI by Apache.

If you truly believe that it is a bug in Apache causing this, then you
will need to track it down. tcpdump showing the incoming request to
the proxy, the outgoing request that this caused to the backend, the
response the backend generates and the response that the proxy
ultimately generates should show what is really happening.

Cheers

Tom

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
   "   from the digest: users-digest-unsubscr...@httpd.apache.org
For additional commands, e-mail: users-h...@httpd.apache.org

Reply via email to