$ http_user_agent与移动设备匹配时的Nginx代理

时间:2016-09-08 06:18:03

标签: nginx proxy user-agent

我制作两个版本的网站,一个用于个人电脑,另一个用于移动电话。

pc版本通过django运行,指向reverse_proxy到http://127.0.0.1:8000/

虽然移动版仅提供/path/for/mobile中的静态路径。

例如,我尝试了很多方法,但无法让它发挥作用。

location / {
    if ($http_user_agent ~ Mobile) {
        root /path/for/mobile;
    }
    else {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8000;
    }
}

3 个答案:

答案 0 :(得分:0)

试试这个 - 如果是移动设备,请使用默认的root,否则使用proxy_pass。

location / {
    set $mobile 0;
    root /path/for/mobile;
    if ($http_user_agent ~ Mobile) {
        set $mobile 1;
    }
    if ($mobile = 0) {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8000;
        break;
    }
}

答案 1 :(得分:0)

如果块被重写并返回,则nginx上唯一的安全操作 尝试类似:

if ($mobile = 0) {
  add_header Content-Type text/plain;
  return 200 "Desktop Version";
  break;
}

验证您的$ mobile变量是否设置正确,然后:

if ($mobile = 0) {
  rewrite ^ /desktopProxy/$request_uri;
}

location ~* ^/desktopProxy/(.*)$ {
  ...
  proxy_pass http://127.0.0.1:8000/$1$is_args$args;
  break;
}

我没有测试“$ 1 $ is_args $ args”条件,在使用prod之前验证。

答案 2 :(得分:0)

经过一番尝试,结果发现使用固定端口号的额外服务器效果很好。

if语句只影响一个数字变量,这会影响端口代理到任何内容的不同版本。

$from_date = '2016-12';
$to_date = '2017-03';