django+vue+nginx+frp搭建漫画网站之移动PC端自动切换(一)

django+vue+nginx+frp搭建漫画网站之移动PC端自动切换(一)

地址:http://www.iewoai.com/

背景图

1、背景

漫画网站电脑端项目目前是用django模板语言构建的,而手机端是使用vue写的。当想实现移动PC自动切换时,其中一个办法就是通过nginx来判断请求头并重定向到指定的服务下。

2、步骤

手机server端增加配置:

if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
      rewrite  ^(.*)    http://comic.tklb.top$1 redirect;
}

rewrite参数:

image.png

电脑端配置:

if ($http_user_agent !~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
  rewrite  ^(.*) http://m.comic.tklb.top$1 permanent;
}

3、问题

1、全局切换的问题

错误:手机端接口报错,手机端host为电脑端host

image_1.png

image_2.png

解决:

接口地址为电脑端的域名,全局切换的话,接口地址变为手机端的域名,就会报错,所以决定不考虑全局切换。

2、nginx条件判断问题

错误:

只在主页的时候判断,同时判断主域名uri和是否为手机端请求头时报错如下:

image_3.png

nginx的配置中不支持if条件的逻辑与&& 逻辑或||运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition

image_4.png

解决:

# 方法一
set $flag 0;
if ($http_user_agent !~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)){
    set $flag "${flag}1";
}
if ($request_uri = "/"){
    set $flag "${flag}1";
}
if ($flag = "011"){
    rewrite  "/" http://comic.tklb.top/ break;
}

# 方法二
location = / {
   if ($http_user_agent !~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)){
      rewrite  "/" http://comic.tklb.top/ break;
  } 
} 

4、其他

1、详情页跳转需求

2021-07-09前需求,之后的page页已经用vue实现

除去首页切换,详情页跳转也是当前需要实现的(问就是手机端的page页还未实现,需要使用电脑端的page页暂时来代替,手机端page页面应该返回手机端的详情,而返回按钮的地址是电脑端的详情)。

电脑端详情页:http://comic.tklb.top/585b2576892f58e9b1bbc107a12c1337_c/

手机端详情页:http://m.comic.tklb.top/#/datail?id=bb3d959d0ef552d6a5f29dee1d5549c7

步骤:

1、在电脑端server里设置

if ($request_uri ~* ^/(.*?)_c/$) {
  set $flag "${flag}2";
}
if ($flag = "012"){
    rewrite  "^/(.*?)_c/$" http://m.comic.tklb.top/#/detail?id=$1 break;
}

2、手机端server里设置

if ($request_uri ~* ^/#/datail?id=(.*?)$) {
  set $flag "${flag}2";
}
if ($flag = "012"){
    rewrite  "^/#/detail?id=(.*?)$" http://comic.tklb.top/$1_c/ break;
}

注:由于下图这个特性,且移动端是vue单页面的,而路由中保留了#,当前决定不去除#和转换成多页面,因此手机端server设置无效

image_5.png

2、urirequest_uri的区别

$uri指的是请求的文件和路径,不包含?或者#之类的东西

$request_uri则指的是请求的整个字符串,包含了后面请求的东西

例如:

$uri: www.baidu.com/document
$request_uri: www.baidu.com/document?x=1 

参考资料:

  1. https://www.cnblogs.com/brianzhu/p/8624703.html

  2. https://blog.csdn.net/weixin_43228360/article/details/105323940

  3. https://www.cnblogs.com/aaa103439/p/68f8124a7848326d8100821748e71068.html

  4. Nginx配置网站适配PC和手机 https://xxxxg.blog.csdn.net/article/details/46680863

  5. Detect Mobile Browsers | Open source mobile phone detection http://detectmobilebrowsers.com/

  6. nginx中location、rewrite用法总结 https://www.cnblogs.com/dadonggg/p/7797281.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python是一种流行的编程语言,有非常丰富的库和框架可供使用。而Django是一个基于Python的开发框架,用于快速搭建Web应用程序。Vue是一种流行的JavaScript框架,用于构建用户界面。 当我们要搭建一个前后端分离的项目时,可以使用PythonDjango框架和Vue框架来实现。下面是大致的步骤: 1. 对于后端,我们可以使用Django框架来搭建RESTful API。首先,创建一个新的Django项目并设置好相关配置。然后,定义数据模型和数据库表,可以使用Django的ORM(对象关系映射)来简化数据库操作。接下来,创建视图函数来处理不同的API请求,可以通过序列化器将模型数据转换为JSON格式进行传输。最后,设置URL路由映射和权限控制,确保API的安全性和可访问性。 2. 对于前端,我们可以使用Vue框架来构建用户界面。首先,创建一个新的Vue项目并安装所需的依赖项。然后,创建组件来管理不同的页面和功能模块。在组件中,可以使用Vue的数据绑定和计算属性等功能来简化数据处理和状态管理。同时,可以使用Vue Router来管理页面之间的导航和路由,以及使用axios库来发送API请求和接收响应。 3. 在前后端之间进行通信时,前端通过axios发送HTTP请求到后端的API接口,后端处理请求并返回相应的数据。前端可以根据接口的返回结果来更新界面和展示数据。 总的来说,使用PythonDjango框架和Vue框架可以很好地实现前后端分离的项目。Django提供了强大的后端支持,可以快速搭建API接口,而Vue框架则提供了便捷的前端开发环境,可以轻松构建用户界面。通过这种搭配,我们可以高效地开发出功能完善、交互流畅的Web应用程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值