代理(或redirect?)每个位置的请求

像这样的东西可以在mod_proxy中全局运行:

ProxyPass /api/* http://localhost:8081/api ProxyPassReverse /api/* http://localhost:8081/api 

所以我所有的/api客户端请求都被定向到http://localhost:8081/api

如果我有两个位置,如localhost/site1/ localhost/site2/ ,我需要不同的redirect每个站点?所有这些应用程序请求/ apiasynchronous

所以访问site1,xhr调用请求/ api,我想要http:// localhost:8081 / api来响应

for / site2一个xhr调用请求/ api,我想要http:// localhost:9091 / api来响应

这可以通过在每个文件夹中的.htaccess来完成,或者通过全局redirect来完成吗?我需要mod_rewrite和http Referrer规则或mod_proxy这个吗?

谢谢

有不同的, 基于位置的代理设置是完全可能的。

首先, ProxyPass不是redirect,即位置不变。 它是从外部获取内容的反向代理 。

当httpd接收到来自客户端的请求时,请求本身被代理到这些后端服务器之一,后端服务器接着处理请求,生成内容,然后将这些内容发送回httpd,然后生成实际的HTTP响应回到客户端。

然后,您不能在.htaccess上下文中使用ProxyPass ,但可以在<Location>上下文中使用它。 假设您要将example.com/site1/api代理到localhost:8081/api/site2/apilocalhost: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> 

您的替代语法也可以直接在<VirtualHost>上下文中使用,但是a) 在存在大量数据时性能可能会受到影响,并且b)必须留下一些作业。


进一步的讨论基于对问题的评论和编辑的额外细节。

虽然可能,但我不能推荐以下作为一个可行的解决scheme ,因为每个请求总是有一个工作的HTTP引用不保证。 例如,如果有任何API请求引用了另一个/api URL,则引用者可能是/api或空的而不是/siteN 。 不同网站的API调用URL不同,比如我的第一个解决scheme,更易于pipe理和可靠。

如果您需要在来自/site1/site2 XMLHttpRequests(XHR)之间共享通用URL /api ,并根据引用者将其代理到不同的后端(如果您的API请求发送引用者),则可以使用mod_rewrite for Proxying用不同的网站来区分请求

  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]