本文要讲的的是如何使用nginx区分pc和手机访问不同的网站,是物理上完全隔离的两套网站(一套移动端、一套pc端),这样带来的好处pc端和移动端 的内容可以不一样,移动版网站不需要包含特别多的内容,只要包含必要的文字和较小的图片,这样会更节省流量。有好处当然也就会增加困难,难题就是你需要维 护两套环境,并且需要自动识别出来用户的物理设备并跳转到相应的网站,当判断错误时用户可以自己手动切换回正确的网站。

简单的服务器端实现方法

有两套网站代码,一套PC版放在/usr/local/website/web,一套移动版放在/usr/local/website/mobile。只需要修改nginx的配置文件件,nginx通过UA来判断是否来自移动端访问,实现不同的客户端访问不同内容。

这种方法的缺点是移动端和PC端用同一个域名,存在黑帽的嫌疑,而且UA并不是总是判断的准确,如果判断错误的情况下,用户不能手动修改访问的网站类型。

关键的Nginx配置如下:

  1. location / {
  2. #默认PC端访问内容
  3. root /usr/local/website/web;
  4. #如果是手机移动端访问内容
  5. if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC\-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT\-)|(SonyEricsson)|(NEC\-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi\-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG\-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC\-)|(SED\-)|(EMOL\-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
  6. {
  7. root /usr/local/website/mobile;
  8. }
  9. index index.html index.htm;
  10. }

推荐的nginx区别手机和PC访问方法

利用前端js和后端nginx配合,js通过设置cookie来设定当前访问哪页面。

增加设置cookie的js代码,这段代码需要在移动网站和PC网站的所有页面都要放置。

  1. function createCookie(name, value, days, domain, path) {
  2. var expires = '';
  3. if (days) {
  4. var d = new Date();
  5. d.setTime(d.getTime() + (days*24*60*60*1000));
  6. expires = '; expires=' + d.toGMTString();
  7. }
  8. domain = domain ? '; domain=' + domain : '';
  9. path = '; path=' + (path ? path : '/');
  10. document.cookie = name + '=' + value + expires + path + domain;
  11. }
  12.  
  13. function readCookie(name) {
  14. var n = name + '=';
  15. var cookies = document.cookie.split(';');
  16. for (var i = 0; i < cookies.length; i++) {
  17. var c = cookies[i].replace(/^\s+/, '');
  18. if (c.indexOf(n) == 0) {
  19. return c.substring(n.length);
  20. }
  21. }
  22. return null;
  23. }
  24.  
  25. function eraseCookie(name, domain, path) {
  26. setCookie(name, '', -1, domain, path);
  27. }

nginx增加如下配置,根据UA和cookie判断当前是移动端还是PC端访问

  1. if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
  2. set $mobile_request '1';
  3. }
  4. if ($http_cookie ~ 'mobile_request=full') {
  5. set $mobile_request '';
  6. }
  7. if ($mobile_request = '1') {
  8. rewrite ^.+ http://m.lvtao.net$uri;
  9. }

移动版页面添加PC版链接

默认用户进来时会先判断UA,如果是手机端访问就会进入手机版,但也会存在误判进入手机版或者需要更多信息进入PC版,那么就需要在移动版的页面放入代码,让用户可以从移动版切换到web版并且下次访问会保留设置。

  1. <a onclick="setCookie('iphone_mode', 'full', 1, 'lvtao.net')" href="http://www.lvtao.net">电脑版</a>

如果用户访问不正确时,点击电脑版链接就可以进入PC版网站,并且24小时内再次访问会记忆上次访问的网站类型设置。

PC版网站增加访问手机版的链接

在PC版的网站适当的地方加入下面的链接让用户可以切换到手机版的网站。

  1. <a onclick="deleteCookie('mobile_mode', 'lvtao.net');" href="http://m.lvtao.net">手机版</a>

完整的nginx端配置,当然是去掉了与本文功能无关的配置,并不是一个完可用的配置,只是给大家一个整体的框架。

PC版网站配置

  1. upstream app_server {
  2. server 0.0.0.0:9001;
  3. }
  4.  
  5. server {
  6. listen 80;
  7. server_name www.lvtao.net;
  8.  
  9. root /path/to/main_site;
  10. # ...
  11.  
  12. location / {
  13. proxy_set_header X-Real-IP $remote_addr;
  14. # ...
  15.  
  16. if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
  17. set $mobile_request '1';
  18. }
  19. if ($http_cookie ~ 'mobile_request=full') {
  20. set $mobile_request '';
  21. }
  22. if ($mobile_request = '1') {
  23. rewrite ^.+ http://m.lvtao.net$uri;
  24. }
  25.  
  26. # serve cached pages ...
  27.  
  28. if (!-f $request_filename) {
  29. proxy_pass http://app_server;
  30. break;
  31. }
  32. }
  33. }

手机移动版配置

  1. upstream m_app_server {
  2. server 0.0.0.0:9001;
  3. }
  4.  
  5. server {
  6. listen 80;
  7. server_name m.lvtao.net;
  8.  
  9. root /path/to/mobile_site;
  10. # ...
  11.  
  12. location / {
  13. proxy_set_header X-Real-IP $remote_addr;
  14. # ...
  15.  
  16. if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
  17. set $mobile_request '1';
  18. }
  19. if ($http_cookie ~ 'mobile_request=full') {
  20. set $mobile_request '';
  21. }
  22. if ($mobile_request != '1') {
  23. rewrite ^.+ http://www.lvtao.net$uri;
  24. }
  25.  
  26. # serve cached pages ...
  27.  
  28. if (!-f $request_filename) {
  29. proxy_pass http://m_app_server;
  30. break;
  31. }
  32. }
  33. }

nginx区分手机与电脑浏览器并进入相应站点的更多相关文章

  1. 【转】Nginx区分PC或手机访问不同网站

    原文链接:http://www.nginx.cn/784.html 近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合 ...

  2. Nginx区分PC或手机访问不同网站

    近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合适的匹配,这样就是近年来流行的“响应式web设计”. 响应式web设 ...

  3. Filter过滤器实现同一地址手机和电脑页面不同

    最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较多的:尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机 ...

  4. Android手机同步电脑端google chrome书签

    我先声明:文中FQ 都是博客园自动将中文(fan qiang)转换为FQ的,并不是我本来写的就是FQ~~ 手机和电脑都必须要能登录google(Xee:几乎所有做开发的人都每天的生活都离不开谷歌了,可 ...

  5. Android手机播放电脑视频文件-屌丝必备

    今天早上一到办公室,照常打开博客园看文章,看到有一片文章是用  http://www.cnblogs.com/wdfrog/p/3738180.html 看到这哥们实现的方法好复杂,又是配置电脑端,又 ...

  6. 手机访问电脑端Wampserver2.4-x64服务

    我用的Wampserver2.4-x64 1. 先确保你的手机和电脑连在同一个局域网内. 2. Window + R, 然后输入 ipconfig,然后获取ip地址, 长这样: 192.168.XX. ...

  7. 手机访问电脑中部署的tomcat应用

    手机访问电脑中部署的tomcat应用. 操作步骤: 第一种:有无线路由的情况. 1.建议局域通信. 操作如下:电脑,手机都自动连接到无线路由器中(无线路由不必非要联网). 2.启动电脑用的tomcat ...

  8. Web—13-判断网站请求来自手机还是pc浏览器

    判断网站请求来自手机还是pc浏览器 #判断网站来自mobile还是pc def checkMobile(request): """ demo : @app.route(' ...

  9. 如何用手机访问电脑上的html文件

    如何用手机访问电脑上的html文件 梦唪 | 浏览 3876 次 推荐于2016-03-26 08:08:58   最佳答案   1,你得搭建服务器,用Apache或者IIS.2,把HTML文件放到服 ...

随机推荐

  1. eclipse编译错误

    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGE ...

  2. QT5程序发布dll依赖

    QT5 发布程序,太庞大了,QT4下,基本的也就20M左右 platforms目录是 对应X:\Qt\Qt5.3.2\5.3\mingw482_32\plugins\platforms 下的qmini ...

  3. Android开源项目(一)

    Android开源项目(一) GitHub在中国的火爆程度无需多~~,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则~~~~了解当下比较流行的Android与iOS开源项 ...

  4. C#实现的内存分页机制的一个实例

    C#实现的内存分页机制的一个实例 //多页索引表管理类(全局主索引表管理类) public class MuliPageIndexFeatureClass : IDisposable { protec ...

  5. UVA - 12230 Crossing Rivers (期望)

    Description You live in a village but work in another village. You decided to follow the straight pa ...

  6. linux下内存调试工具——valgrind

    1.valgrind之memcheck  最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获.所以,它 ...

  7. java注解入门(含源码下载)

    注解(Annotation)是从jdk1.5开始增加的特性.学习注解能够读懂框架的代码:让编程更加简洁,代码更加清晰. 注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. ...

  8. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

    数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...

  9. Java,js,多条件split字符分割

    后台字符串分割处理: String s = "i20002/400|i3030/300";        String[] s1 = s.split("\\||/&quo ...

  10. NSString 用法大全。

    一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空字符串,给予赋值.  NSString *astri ...