Centos

每個位置的代理(或重定向?)請求

  • May 29, 2017

像這樣的東西可以在 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 請求引用了另一個/apiURL,則引用者可能是/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]

引用自:https://serverfault.com/questions/852543