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参数:
电脑端配置:
if ($http_user_agent !~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
rewrite ^(.*) http://m.comic.tklb.top$1 permanent;
}
3、问题
1、全局切换的问题
错误:手机端接口报错,手机端host为电脑端host
解决:
接口地址为电脑端的域名,全局切换的话,接口地址变为手机端的域名,就会报错,所以决定不考虑全局切换。
2、nginx条件判断问题
错误:
只在主页的时候判断,同时判断主域名uri
和是否为手机端请求头时报错如下:
nginx的配置中不支持if
条件的逻辑与&&
逻辑或||
运算 ,而且不支持if
的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition
解决:
# 方法一
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页面应该返回手机端的详情,而返回按钮的地址是电脑端的详情)。
步骤:
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
设置无效
2、uri
和request_uri
的区别
$uri
指的是请求的文件和路径,不包含?
或者#
之类的东西
$request_uri
则指的是请求的整个字符串,包含了后面请求的东西
例如:
$uri: www.baidu.com/document
$request_uri: www.baidu.com/document?x=1
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦