设为首页 收藏本站
查看: 648|回复: 0

[经验分享] Nginx区分PC或手机访问不同网站

[复制链接]

尚未签到

发表于 2016-12-27 10:45:09 | 显示全部楼层 |阅读模式
近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合适的匹配,这样就是近年来流行的“响应式web设计”。
响应式web设计是一种纯前端技术js、css等实现的针对不同设备访问同一网址看到不同的布局,是页面内容更适合当前设备阅读。但这个不是本文的重点,重点还是放在nginx如何实现上来。
本文要讲的的是如何使用nginx区分pc和手机访问不同的网站,是物理上完全隔离的两套网站(一套移动端、一套pc端),这样带来的好处pc端和移动端的内容可以不一样,移动版网站不需要包含特别多的内容,只要包含必要的文字和较小的图片,这样会更节省流量。有好处当然也就会增加困难,难题就是你需要维护两套环境,并且需要自动识别出来用户的物理设备并跳转到相应的网站,当判断错误时用户可以自己手动切换回正确的网站。
下面以264查询网为实例来说明如何实现上面的需求。
明确的的需求:
1.制作两个站点PC端网站www.264.cn,和移动端网站m.264.cn
2.使用pc或移动设备访问任何一个域名都会跳到相应的站点。
3.用户可以选择访问移动版还是PC版网站,移动版网站始终有切换到PC版的链接,PC版当网站通过手机访问时会提供移动版网站的链接。
4.当用户选着访问其中一种类型的网站后,保存设置结果生效时间为24小时,当然长短可以自己设置。

简单的服务器端实现方法
有两套网站代码,一套PC版放在/usr/local/website/web,一套移动版放在/usr/local/website/mobile。只需要修改nginx的配置文件件,nginx通过UA来判断是否来自移动端访问,实现不同的客户端访问不同内容。
这种方法的缺点是移动端和PC端用同一个域名,存在黑帽的嫌疑,而且UA并不是总是判断的准确,如果判断错误的情况下,用户不能手动修改访问的网站类型。
关键的Nginx配置如下:


location / {#默认PC端访问内容
    root 
/usr/local/website/web;#如果是手机移动端访问内容
    
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)" ){
root 
/usr/local/website/mobile;}
index index
.html index.htm;}
纯客户端js实现方式
下面这段代码放到首页<head>和</head>之间即可


<script type="text/javascript">// <![CDATA[if(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))){if(window.location.href.indexOf("?mobile")<0){try{if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)){
                                
//触屏手机版地址
window
.location.href="http://m.264.cn";}else if(/iPad/i.test(navigator.userAgent)){
                                
//pad版地址}else{
                                
//普通手机版地址
window
.location.href="http://wap.264.cn"}}catch(e){}}}// ]]></script>
推荐的nginx区别手机和PC访问方法
利用前端js和后端nginx配合,js通过设置cookie来设定当前访问哪页面。

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

function createCookie(name, value, days, domain, path) {
  
var expires = '';
  
if (days) {
    
var d = new Date();
    d
.setTime(d.getTime() + (days*24*60*60*1000));
    expires 
= '; expires=' + d.toGMTString();
  
}
  domain 
= domain ? '; domain=' + domain : '';
  path 
= '; path=' + (path ? path : '/');
  document
.cookie = name + '=' + value + expires + path + domain;}function readCookie(name) {
  
var n = name + '=';
  
var cookies = document.cookie.split(';');
  
for (var i = 0; i < cookies.length; i++) {
    
var c = cookies[i].replace(/^\s+/, '');
    
if (c.indexOf(n) == 0) {
      
return c.substring(n.length);
    
}
  
}
  
return null;}function eraseCookie(name, domain, path) {
  setCookie
(name, '', -1, domain, path);}
nginx增加如下配置,根据UA和cookie判断当前是移动端还是PC端访问

if($http_user_agent ~*'(Android|webOS|iPhone|iPod|BlackBerry)'){set $mobile_request '1';}if($http_cookie ~'mobile_request=full'){set $mobile_request '';}if($mobile_request ='1'){
rewrite
^.+ http://m.264.cn$uri;}
移动版页面添加PC版链接
默认用户进来时会先判断UA,如果是手机端访问就会进入手机版,但也会存在误判进入手机版或者需要更多信息进入PC版,那么就需要在移动版的页面放入代码,让用户可以从移动版切换到web版并且下次访问会保留设置。


<a onclick="setCookie('iphone_mode', 'full', 1, '264.cn')" href="http://www.264.cn">
  电脑版
</a>
如果用户访问不正确时,点击电脑版链接就可以进入PC版网站,并且24小时内再次访问会记忆上次访问的网站类型设置。
PC版网站增加访问手机版的链接
在PC版的网站适当的地方加入下面的链接让用户可以切换到手机版的网站。


<a onclick="deleteCookie('mobile_mode', '264.cn');" href="http://m.264.cn">
  手机版
</a>
完整的nginx端配置,当然是去掉了与本文功能无关的配置,并不是一个完可用的配置,只是给大家一个整体的框架。
PC版网站配置

upstream app_server {
  server 
0.0.0.0:9001;}
server 
{
  listen 
80;
  server_name www
.264.cn;
  root 
/path/to/main_site;
  
# ...
  location 
/ {
    proxy_set_header X
-Real-IP $remote_addr;
    
# ...
    
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
      
set $mobile_request '1';
    
}
    
if ($http_cookie ~ 'mobile_request=full') {
      
set $mobile_request '';
    
}
    
if ($mobile_request = '1') {
      rewrite 
^.+ http://m.264.cn$uri;
    
}
    
# serve cached pages ...
    
if (!-f $request_filename) {
      proxy_pass http
://app_server;
      
break;
    
}
  
}}
手机移动版配置

upstream m_app_server {
server 
0.0.0.0:9001;}
server 
{
  listen 
80;
  server_name m
.264.cn;
  root 
/path/to/mobile_site;
  
# ...
  location 
/ {
    proxy_set_header X
-Real-IP $remote_addr;
    
# ...
    
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
      
set $mobile_request '1';
    
}
    
if ($http_cookie ~ 'mobile_request=full') {
      
set $mobile_request '';
    
}
    
if ($mobile_request != '1') {
      rewrite 
^.+ http://www.264.cn$uri;
    
}
    
# serve cached pages ...
    
if (!-f $request_filename) {
      proxy_pass http
://m_app_server;
      
break;
    
}
  
}}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-320143-1-1.html 上篇帖子: 利用nginx_push_stream_module实现服务器消息推送 下篇帖子: 基于Nginx下的Joomla伪静态Rewrite配置[原创]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表