每个位置的代理(或重定向?)请求

每个位置的代理(或重定向?)请求

类似这样的操作可以通过 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/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)必须留一些事情做。


根据问题的评论和编辑的附加细节进行进一步讨论。

虽然可能,我不推荐以下作为可行的解决方案,因为不能保证每个请求都始终有一个有效的 HTTP referer。例如,如果任何 API 请求引用了另一个/apiURL,则 referer 可能是/api或为空,而不是/siteN。像我的第一个解决方案一样,为来自不同站点的 API 调用设置不同的 URL,这样更易​​于管理和可靠。

如果你需要/apiXMLHttp请求(XHR)并根据/site1referer/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]

相关内容