$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;
}
}
我做了两个版本的网站,一个是pc版,一个是手机版。
pc版通过django运行,通过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;
}
}
试试这个 - 如果是移动设备,则使用默认根目录,否则 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;
}
}