像这样的东西可以在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/api到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>
您的替代语法也可以直接在<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]