每個位置的代理(或重定向?)請求
像這樣的東西可以在 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://localhost:8081/api**響應
對於 /site2 進行 xhr 呼叫以請求 /api,我希望**http://localhost:9091/api**響應
這可以通過每個文件夾中的 .htaccess 或通過全域重定向來完成嗎?我需要帶有 http Referrer 規則的 mod_rewrite 或 mod_proxy 嗎?
謝謝
完全有可能擁有不同的、基於位置的代理設置。
首先,這
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 引用。例如,如果任何 API 請求引用了另一個
/api
URL,則引用者可能是/api
或為空,而不是/siteN
. 像我的第一個解決方案一樣,為來自不同站點的 API 呼叫提供不同的 URL 更易於管理和可靠。如果您需要在XMLHttpRequests (XHR)
/api
之間共享公共 URL ,並根據 referer 將它們代理到不同的後端(如果您的 API 請求發送 referer),則可以使用 mod_rewrite 進行代理區分來自不同站點的請求和/site1``/site2
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]