
У меня есть веб-сайт, на котором есть страница мобильной версии, и поскольку мой веб-сайт находится за обратным прокси-сервером, мне нужна условная функция, которая может решить, какую версию показывать посетителям. Я использую Apache 2.4, ProxyPass и ProxyReverse не могут находиться внутри оператора "If - Elseif", поэтому я попробовал использовать RewriteCond, но это не сработало.
Вот мой VirtualHost
<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, поскольку эта директива делает нечто совершенно другое, а именно обрабатывает перенаправления, поступающие с бэкэнда, который вы изначально проксируете.