$http_user_agent 匹配 mobile 时的 Nginx 代理

Nginx proxy when $http_user_agent matches mobile

我做了两个版本的网站,一个是pc版,一个是手机版。

pc版通过django运行,通过http://127.0.0.1:8000/.

指向一个reverse_proxy

而移动版仅服务于/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;
    }
}

试试这个 - 如果是移动设备,则使用默认根目录,否则 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;
    }
}

nginx 上唯一安全的操作如果块被重写并且 return。
尝试类似的东西:

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/$is_args$args;
  break;
}

我没有测试“$1$is_args$args”条件,在产品上使用之前验证一下。

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

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

server {
    # static server
    listen 11112;
    root /path/to/static/html;
}

server {
    # dynamic server
    listen 11111;
    client_max_body_size 300m;
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://django_devaluation:8000/;
    }
}

server {
    listen 80;
    server_name www.example.com;
    index index.html;

    // here do the condition separation
    set $proxy_port 11111;
    if ($http_user_agent ~* mobile) {
        set $proxy_port 11112;
    }

    location / {
        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:$proxy_port;
    }
}