Apache-2.4

帶有 RewriteCond 的 Apache 條件反向代理

  • August 18, 2020

我有一個有移動版頁面的網站,由於我的網站位於反向代理之後,我需要一個條件函式來決定向訪問者顯示哪個版本。我使用的是 Apache 2.4,ProxyPass 和 ProxyReverse 不允許在“If - Elseif”語句中,所以我嘗試了 RewriteCond,但沒有成功。

這是我的虛擬主機

<VirtualHost *:80>
ServerName MyWebsite.com
ServerAlias www.ReverseProxy/ ReverseProxy/m/
ProxyPreserveHost On
RewriteEngine On
RequestHeader set "Host" "MyWebsite.com"

#Show mobile version if visitors used mobile device
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC]
ProxyPass / http://MyWebsite.com:80/m/
ProxyPassReverse / http://MyWebsite.com:80/m/

#Show desktop version if not a mobile device
RewriteCond %{HTTP_USER_AGENT} "!(android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos)" [NC]
ProxyPass / http://MyWebsite.com:80/
ProxyPassReverse / http://MyWebsite.com:80/
</VirtualHost>

使用上面的 VirtualHost,我的反向代理只顯示移動版本。如何解決這個問題?我需要添加/更改什麼才能使其正常工作?

您不能執行來自不同模組的條件反向代理混合指令。

對於這種情況,正確的方法是一直使用 mod_rewrite:

RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC]
RewriteRule ^/(.*) http://MyWebsite.com:80/m/$1 [P,L]
ProxyPassReverse / http://MyWebsite.com:80/m/

請注意,這裡的關鍵是標誌“P”,以使 mod_rewrite 代理而不是重定向。

另請注意,您仍然必須使用 ProxyPassReverse,因為該指令完全執行其他操作,即處理來自後端的重定向,您首先是反向代理。

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