1

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 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

1 Answer 1

2

Having different, location based proxy settings is perfectly possible.

First, the ProxyPass is not a redirection i.e. location doesn't change. It is a 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 <Location> 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:

<VirtualHost *:80>
    ServerName example.com

    <Location "/site1/api/">
        ProxyPass "http://localhost:8081/api/"
        ProxyPassReverse "http://localhost:8081/api/"
    </Location>

    <Location "/site2/api/">
        ProxyPass "http://localhost:8082/api/"
        ProxyPassReverse "http://localhost:8082/api/"
    </Location>
</VirtualHost>

Your alternative syntax is also possible directly in the <VirtualHost> 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 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]
12
  • thanks, Not sure if this answers my question, I want to distinguish site1 and site2 location not api1 and api2, so, when requesting /api/ for site1 proxy to /api1, when requesting /api/ from site2 proxy to /api2, if that makes sense
    – Pan Chrono
    May 29, 2017 at 8:45
  • imagine that all clients hit /api/, but they need to get different responses depending on their location (site1/site2)
    – Pan Chrono
    May 29, 2017 at 8:51
  • What do you mean here by "location"? Is there two applications hosted in example.com/site1 and example.com/site2, both accessing example.com/api? May 29, 2017 at 9:00
  • yes, the /api URL may be the same on both, but they must get different responses
    – Pan Chrono
    May 29, 2017 at 9:05
  • It may be difficult to distinguish these queries from each other. One could use RewriteCond %{HTTP_REFERER} or RewriteCond "%{HTTP_USER_AGENT}" to rewrite /api to /api1 or /api2, but that requires this kind of assumptions can be made. I think it would be easier to have separated /api1 and /api2 to serve them. May 29, 2017 at 9:43

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .