nginx真是个好东西,老早以前就有所耳闻,但是没用过,最近开始用Python做web开发才开始接触,发现果然是异常强大,今天又把老网站服务器倒腾了一下,换成tomcat+nginx跑起来,记录一下外网的服务器配置识别移动终端走不同的反向代理路径过程

识别移动终端特征

找到一个现成的网站提供了识别移动终端特征的各种脚本:
http://detectmobilebrowsers.com/mobile

其实就是对获取到的$http_user_agent变量用正则表达式进行匹配.直接放上来适用于nginx的脚本原始内容:

set $mobile_rewrite do_not_perform;if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {set $mobile_rewrite perform;
}if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {set $mobile_rewrite perform;
}if ($mobile_rewrite = perform) {rewrite ^ http://detectmobilebrowser.com/mobile redirect;break;
}

nginx完整配置

server {listen       80 default_server;listen       [::]:80 default_server;server_name  xxx.com;# 判断访问终端是否为移动端set $mobile_rewrite do_not_perform;if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {set $mobile_rewrite perform;}if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {set $mobile_rewrite perform;}location / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;if ($mobile_rewrite = perform) {rewrite ^ /m/$1;proxy_pass http://192.168.1.1;break;}rewrite ^ /web/$1;proxy_pass http://192.168.1.1;}location /web {proxy_pass http://192.168.1.1/web/;}location /m {proxy_pass http://192.168.1.1/m/;}location ^~ /r/ {# 设置缓存有效期1天add_header Cache-Control "public,max-age=86400";proxy_pass http://192.168.1.1/r/;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr;proxy_read_timeout 10;}location ~* \.(dy|shtml|action)$ {proxy_pass http://192.168.1.1;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr;proxy_read_timeout 10;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

避坑指南

使用if语句后的正确写法:

# 正确姿势
if ($mobile_rewrite = perform) {rewrite ^ /m/$1;proxy_pass http://192.168.1.1;break;}

这一段配置中一开始是这样写的(错误示范):

# 错误示范
if ($mobile_rewrite = perform) {proxy_pass http://192.168.1.1/m;break;}

目的是想要将命中移动终端特征的访问用proxy_pass扔给http://192.168.1.1/m这个地址,但是使用nginx -t进行测试发现报错:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /opt/nginx/nginx-1.17.2/conf/host/lian.conf:26
nginx: configuration file /opt/nginx/nginx-1.17.2/conf/nginx.conf test failed

也就是说在使用了if语句后proxy_pass后面只允许用IP地址或者域名,后面不能再接/xx这样的路径,逛了一圈stackoverflow找到了解决方案,就是在定义proxy_pass前先用rewrite将要访问的地址进行重定向.

nginx配置移动终端走不同的反向代理路径相关推荐

  1. nginx反向代理模块配置详解_Nginx(三):反向代理负载均衡集群配置详解

    概述: 本篇主要总结Nginx实现反向代理和负载均衡功能相关模块的配置说明.主要使用到的模块如下:ngx_http_proxy_moduleNginx实现反向代理功能 ngx_http_upstrea ...

  2. Bloom是REST API缓存中间件,充当负载平衡器Nginx和REST API服务之间的反向代理

    Bloom是REST API缓存中间件,充当负载平衡器Nginx和REST API服务之间的反向代理 翻译来源:https://gitee.com/yunwisdoms/bloom Bloom是RES ...

  3. nginx反向代理模块配置详解_Nginx服务器的反向代理proxy_pass配置方法讲解

    就普通的反向代理来讲 Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { ...

  4. Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例

    场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...

  5. nginx做服务器入口_Nginx实现http反向代理

    什么是反向代理? 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  6. nginx配置跨域、gzip加速、代理详细讲解

    1.配置跨域 这个很简单,直接打开配置nginx.conf ,在http下配置下面三行代码:当然如果你是想某一个虚拟主机下跨域,那就在哪个server下面添加 add_header Access-Co ...

  7. Nginx详解+身份验证+虚拟主机+反向代理负载均衡

    一.差异对比 Apache Nginx 配置相对复杂 配置相对简单 原生支持动态和静态页面 支持静态页面 模块相对安全 高性能模块出产迅速.社区活跃 BUG相对较少,消耗资源较多 BUG相对较多,节省 ...

  8. 【ghost】centos使用nginx实现ghost博客系统的反向代理

    ~转载请注明http://blog.csdn.net/u013015161/article/details/48375565 整个8月份都没有更新博客,一方面是自己在忙一些有的没的,另一方面,也是懒的 ...

  9. Nginx学习笔记(二):反向代理

    一:nginx 反向代理 Nginx 服务器的反向代理服务是其最常用的重要功能,由反向代理服务也可以衍生出很多与此相关的 Nginx 服务器重要功能,比如后面会介绍的负载均衡.本篇博客会先介绍 Ngi ...

最新文章

  1. Alpha 冲刺 (2/10)
  2. Unity3d连接SQL Server数据库出现SocketException: 使用了与请求的协议不兼容的地址错误...
  3. html列表穿插广告怎么实现,基于innerHTML中的script广告实现代码[广告全部放在一个js里面]...
  4. Python学习笔记:匿名函数
  5. WP Rocket插件无需授权版本
  6. ArcGIS 的 http://localhost:8399/arcgis/rest/services 无法打开,显示404 的解决办法
  7. Android -- 开机启动无界面后台程序
  8. 人工智能实验评价指标_人工智能实验报告.pdf
  9. webpack2中postcss-loader报错noconfigfound
  10. 代刷魔兽世界监狱的脚本
  11. 简单二叉树的模型和解法(C++)
  12. MySQL从字符串提取数字
  13. OM302工业DTU对接亚控kingscada,实现水泵站一体化智慧改革
  14. 定量分析双花(双重支付)问题
  15. 开源中国 Android 文件夹管理
  16. Oracle 11gR2 dataguard搭建说明 --- duplicate方式
  17. ucosiii源码注释
  18. VMware低版运行高版+破解root口令+静态IP配置
  19. 四六级重要单词(三)
  20. python升级pip

热门文章

  1. 2022-2028全球汽车碳纤维复合材料零件行业调研及趋势分析报告
  2. php输出json数据方法
  3. 农牧行业全产业链20+业务用契约锁电子签,释放成本、提效90%
  4. 玄武短信接口和移动MAS短信接口的API封装
  5. 模糊逻辑学习--什么是模糊逻辑
  6. Action recognition in video
  7. 强制卸载阿里云盾(安骑士)
  8. vue3+axios:图片链接转换成二进制文件流后并提交服务器
  9. RS232接口不通问题
  10. 接口_公开课_课堂笔记