Something like this works globally
with
mod_proxy:
ProxyPass
/api/* http://localhost:8081/api
ProxyPassReverse /api/*
http://localhost:8081/api
so
all my client requests for /api
are directed to
http://localhost:8081/api
What
if I got two locations like localhost/site1/
&
localhost/site2/
and I needed different redirection
per site?all these apps request /api
asynchronously
so visiting site1,
an xhr call is made requesting /api, I would like href="http://localhost:8081/api" rel="nofollow
noreferrer">http://localhost:8081/api to respond
for /site2 an xhr call is made requesting /api,
I would like http://localhost:9091/api to
respond
Can this be done with an .htaccess in
each of those folders, or by global redirection?Do I need mod_rewrite with http Referrer
rule or mod_proxy for this
one?
thanks
Answer
Having different, location based proxy settings is
perfectly possible.
First, the href="https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass" rel="nofollow
noreferrer">ProxyPass
is not a href="https://en.m.wikipedia.org/wiki/URL_redirection" rel="nofollow
noreferrer">redirection i.e. location doesn't change. It is a href="https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html" rel="nofollow
noreferrer">reverse proxy that obtains the content from external
source.
As httpd
receives a request from a client, the request itself is
proxied to one of
these backend servers, which then handles the
request, generates the content
and then sends this content back to
httpd, which then generates the actual
HTTP response back to the
client.
Then,
you can't use ProxyPass
in .htaccess
context, but it's possible to use it in
context. Let's assume that you want example.com/site1/api
to be
proxied to localhost:8081/api
and
/site2/api
to
localhost:8082/api
:
*:80>
ServerName example.com
"/site1/api/">
ProxyPass "http://localhost:8081/api/"
ProxyPassReverse "http://localhost:8081/api/"
"/site2/api/">
ProxyPass "http://localhost:8082/api/"
ProxyPassReverse "http://localhost:8082/api/"
Your
alternative syntax is also possible directly in the
context, but a) it can carry a
performance penalty when present in very large numbers and b) something must
be left to homework.
/>
Further discussion based on additional
details from comments & edit on the
question.
While possible,
I can't recommend the following as a viable solution, as
having always a working HTTP referer on every request isn't guaranteed. For example, if
any API request has reference to another /api
URL, the referer
might be /api
or empty instead of
/siteN
. Having different URLs for API calls from different
sites, like in my first solution, is much more manageable and
reliable.
If you need to share the common URL
/api
between XMLHttpRequests (XHR)
from /site1
and /site2
and proxy them
to different back-ends based on referer (if your API requests sends referer), it might
be possible to rel="nofollow noreferrer">Use mod_rewrite for Proxying distinguish the
request from different sites with
RewriteEngine
on
RewriteCond %{HTTP_REFERER}
^https://example\.com\/site1/
RewriteRule ^api/(.*)$
"http://localhost:8081/api/$1" [P]
RewriteCond %{HTTP_REFERER}
^https://example\.com\/site2/
RewriteRule ^api/(.*)$
"http://localhost:8082/api/$1" [P]
Comments
Post a Comment