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]