记录一次nuxt.js 加 nginx 访问https链接但是301跳转到http url路径的问题

释放双眼,带上耳机,听听看~!

请求示意图如下
记录一次nuxt.js 加 nginx 访问https链接但是301跳转到http url路径的问题

事情起因是需要测试微信授权登录

1. 现象描述

但是在微信授权成功后返回到https://abc.com/path?abc=xxx时发生301重定向到http://abc.com/path/?abc=xxx

然后就陷入怀疑人生的状态

2. 原因分析

为啥服务端会返回301呢?首先需要弄清楚状态码的含义。HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义:

  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 307 Temporary Redirect
    301是永久重定向。
    如果使用Nginx作为HTTP服务器,那么当用户输入一个不存在的地址之后,基本上会有两种情况:
  1. 返回404状态码,
  2. 返回301状态码和重定向地址。

404 Not Found不做讨论,只说下301 Moved Permanently的处理过程。

首先需要明确的问题是,301重定向在什么情况下会被触发呢?

答案是:Nginx负责设置301 Moved Permanently状态码。但nginx.conf控制Nginx如何处理301 Moved Permanently状态码! 换句话说,要不要进行页面重定向,和怎么重定向,完全是用户配置的结果!

Nginx主动设置301 Moved Permanently状态码只有一种情况,
当用户在浏览器输入了一个url地址,末尾部分是一个文件目录且不以斜杠”/“结尾,
比如 “www.test.com/index” 。
Nginx没有找到index这个文件,但发现了index是个目录
于是本次访问的返回状态码就会被设置成301 Moved Permanently

一般情况下,我们会在nginx.conf中配置
absolute_redirectserver_name_in_redirectport_in_redirect,以便到达个性化的重定向功能。其中absolute_redirect控制Location url的生成方式。

absolute_redirect设置成on,则生成绝对路径作为Location url。
absolute_redirect设置成off,则生成相对路径作为Location url。

只有absolute_redirect设置为on时,另外两个配置才会生效。
server_name_in_redirect为on时,使用Nginx配置文件中的server_name作为Location url中的host,否则使用用户请求url中的主机名作为host;

port_in_redirect设置为on时,使用nginx监听的端口来构造Location url,否则不设置port。

因此,上述三个配置项共同控制了Location url的结果,
例如: “Location: http://server_name:port/index/”。
这三项配置的默认值是

absolute_redirect=on,
server_name_in_redirect=off,
port_in_redirect=on

因此默认的Location url将是 “www.test.com/index/”

2. 解决方案

最简便的解决方法便是,设置absolute_redirect为off,构造相对路径作为Location url,示例如下:

 server {
        listen 80;
        # 设置相对url重定向
        absolute_redirect off;
        server_name localhost;
        charset utf-8;
        access_log logs/access.log main;
        error_log logs/error.log;

        large_client_header_buffers 4 16k;
        client_max_body_size 300m;
        client_body_buffer_size 128k;

        location / {
            index  index.html;
            root   /var/www/index/;
        }
    }

给TA打赏
共{{data.count}}人
人已打赏
Linux技巧

Centos 设置时区提示 Failed to set time zone: Access denied 解决方案

2022-8-3 17:11:26

未分类

C4D高级精品教程-灯光摄像机动画场景渲染讲解学习 SOM-Lights, Camera, Render!

2021-3-19 17:19:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索