之前有个项目有个需求是同一个地址PC端访问的时候直接返回当前网页,而如果是移动端访问,则需要重定向到移动端的另一个地址,当时想到的方案就是通过nginx来做,然后网上找了一些相关资料,最后配置达到了要求,现在分享一下这个配置方式。

需求

先看一下这个具体的需求的复现场景,我这里用flask写了两个简单的接口,第一个借口web的请求格式为/web/12这种,第二个接口为/mobile/12这种,这里的需求就是当使用PC端访问/web/12直接正常返回,而当使用移动端访问/web/12的时候转发到/mobile/12请求。

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/web/<int:num>/', methods=['GET'])
def web(num):
    # 获取当前访问的完整地址
    current_url = request.url

    # 构建响应数据
    response_data = {
        "current_url": current_url,
        "args": request.args.to_dict()
    }

    # 返回响应数据作为 JSON 响应
    return jsonify(response_data)


@app.route('/mobile/<int:num>/', methods=['GET'])
def mobile(num):
    # 获取当前访问的完整地址
    current_url = request.url

    # 构建响应数据
    response_data = {
        "current_url": current_url,
        "args": request.args.to_dict()
    }

    # 返回响应数据作为 JSON 响应
    return jsonify(response_data)


if __name__ == '__main__':
    app.run(debug=True)

nginx配置实现

看看我这个配置

server {
    listen 8050;
    server_name flask.local;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    set $flag 0;
    if ($http_user_agent ~* (mobile|iphone|ipad|android)){
        set $flag "${flag}1";
    }
    if ($request_uri ~* /web/(.*?)$){
        set $flag "${flag}1";
    }
    if ($flag = "011"){
        rewrite ^/web/(.*)$ /mobile/$1 last;
    }
}

这个配置实现这个需求的方式就是设置了3个判断条件,第一个判断条件判断请求头是否匹配到移动端,当然这里的匹配写的比较随意,实际的移动端可能比这个复杂,第二个判断条件是匹配地址,也就是需要进行规则转发的规则,第三个判断条件才是真正的判断,就是前面两个条件同时满足的时候才触发重定向。

为什么使用这种方式而不是直接同时判断请求地址和请求头?实际上我最开始也是这样想的,但是一旦使用这个方式就需要考虑else的条件应该这么写,不然会导致本身的PC端访问直接报错,我没有想到怎么写,并且在ChatGPT提问也给出的都是错误的方案,所以只能用上面这个方案实现。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://tendcode.com/subject/article/nginx-mobile-conf/

许可协议:署名-非商业性使用 4.0 国际许可协议