类似这样的操作可以通过 mod_proxy 全局运行:
ProxyPass /api/* http://localhost:8081/api
ProxyPassReverse /api/* http://localhost:8081/api
所以我的所有客户请求/api
都指向http://localhost:8081/api
如果我有两个位置(如localhost/site1/
& )localhost/site2/
并且每个站点需要不同的重定向,该怎么办?所有这些应用程序都会异步请求 /api
因此访问 site1 时,会进行一个 xhr 调用,请求 /api,我想要http://本地主机:8081/api回复
对于 /site2,进行了一个 xhr 调用,请求 /api,我希望http://本地主机:9091/api回复
是否可以通过每个文件夹中的 .htaccess 或全局重定向来完成此操作?我是否需要带有 http Referrer 规则的 mod_rewrite 或 mod_proxy?
谢谢
答案1
拥有不同的,基于位置的代理设置是完全有可能的。
首先,ProxyPass
不是一个重定向即位置不会改变。这是一个反向代理从外部来源获取内容。
当 httpd 从客户端接收到请求时,请求本身会被代理到其中一个后端服务器,然后该服务器处理该请求、生成内容并将该内容发送回 httpd,然后 httpd 生成实际的 HTTP 响应返回给客户端。
然后,您不能在上下文ProxyPass
中使用.htaccess
,但可以在<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)必须留一些事情做。
根据问题的评论和编辑的附加细节进行进一步讨论。
虽然可能,我不推荐以下作为可行的解决方案,因为不能保证每个请求都始终有一个有效的 HTTP referer。例如,如果任何 API 请求引用了另一个/api
URL,则 referer 可能是/api
或为空,而不是/siteN
。像我的第一个解决方案一样,为来自不同站点的 API 调用设置不同的 URL,这样更易于管理和可靠。
如果你需要/api
在XMLHttp请求(XHR)并根据/site1
referer/site2
将它们代理到不同的后端(如果你的 API 请求发送 referer),那么可能可以使用 mod_rewrite 进行代理区分来自不同站点的请求
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]