使用 RewriteCond 的 Apache 条件反向代理

使用 RewriteCond 的 Apache 条件反向代理

我有一个网站,其中有一个移动版页面,由于我的网站位于反向代理之后,因此我需要一个条件函数来决定向访问者显示哪个版本。我使用的是 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,我的反向代理仅显示移动版本。如何解决?我需要添加/更改什么才能使其正常工作?

答案1

您不能对来自不同模块的混合指令进行条件反向代理。

对于这种情况,正确的方法是一直使用 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,因为此指令完全执行其他操作,即首先处理来自您反向代理的后端的重定向。

相关内容