nginx 配置vue单页面404报错

直接贴上配置

   location /  {
        root /data/www/beta.www.bazikeji.com/dist;
        set $teacher_status '';
        if ($arg_teacher_token) {
            set $teacher_status  A;
        }
        if ($uri = '/member/Invitation.html') {
           set $teacher_status "${teacher_status}B";
        }
        if ($teacher_status = AB) {
            #访问首页带上 teacher_token 或者 / 则跳转到邀请页面(某些邀请连接已经被放到一些网站上面无法改动)
            rewrite ^/(.*)  /invitation  redirect;
        }
        try_files $uri $uri/ /index.html;
    }

需要把 /member/Invitation.html ?teacher_token=b6012304f8d852b1ff5c087e07bbc0c8 改写成 /invitation?teacher_token=b6012304f8d852b1ff5c087e07bbc0c8 兼容项目老版本的功能实现了

但是经过测试发现下面几个链接会报404

/invitation?teacher_token=b6012304f8d852b1ff5c087e07bbc0c8

/member/Invitation.html

查看nginx的错误日志

2020/01/07 16:05:27 [error] 8716#0: *6793 open() "/data/www/beta.www.bazikeji.com/dist/invitation" failed (2: No such file or directory), client: 114.93.215.139, server: beta.www.bazikeji.com, request: "GET /invitation?teacher_token=b6012304f8d852b1ff5c087e07bbc0c8&from=qr HTTP/1.1", host: "beta.www.bazikeji.com"

2020/01/07 16:06:11 [error] 8716#0: *6796 open() "/data/www/beta.www.bazikeji.com/dist/member/Invitation.html" failed (2: No such file or directory), client: 114.93.215.139, server: beta.www.bazikeji.com, request: "GET /member/Invitation.html HTTP/1.1", host: "beta.www.bazikeji.com"

try_files 似乎并没与工作

当时项目急着上线,自己也没细想其中的问题的所在,用了一个很应急的方法配置了一下error_page , 将404返回首页

    error_page 404 @404;
    location @404{
        try_files $uri $uri/ /index.html;
    }

一切都是妥妥的了,线上运行了半年也没啥问题。

最近在整理日志,想把日志集中统一管理发现nginx的error log 全屏的404错误信心,就想找找原因。

最后通过控制变量法(将配置项按块,按行依次注释),发现 上图配置的两个if 只要有一个if为true,下面的try_files就会不起作用。

后面nginx的官网找到了文章将这个问题的 https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

如果在location 里面使用 if ,if 里面 最好使用 return rewrite 这两个命令,其余的命令可能导致不可预测的行为 ,例如本文的try_files, 发现不起作用。

最后把nginx配置改成如下,就好了

    location /  {
        try_files $uri $uri/ /index.html;
        root /data/www/beta.www.bazikeji.com/dist;
    }
    location /member/Invitation.html {
        rewrite ^/(.*)  /invitation  redirect;
    }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注