欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 运维知识 > nginx >内容正文

nginx

nginx 301跳转踩坑总结 -凯发k8官方网

发布时间:2025/1/21 nginx 26 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 nginx 301跳转踩坑总结 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

有一天,公司的服务切换域名,禁用了http协议,只允许通过https协议访问。这时出现了一个奇奇怪怪的问题,在浏览器地址栏敲入url访问静态资源目录时,发现默认跳转到了http协议的地址。网络拓扑结构如下:

如上图所示,客户端https请求先到达api网关,然后网关将请求通过http协议转发到静态资源服务器。

调出浏览器发现客户端发送的https请求收到了一个301状态码的响应,并且响应头中的location字段便是跳转到的http协议的地址。

1.原因分析

为啥服务端会返回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的通信过程如下所示:

一般情况下,我们会在nginx.conf中配置absolute_redirect ,server_name_in_redirect和port_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/” 。

回到最开始的问题,https访问跳转到http的原因便可以梳理清楚了,作为静态资源服务器的nginx设置了301状态码,并且由于它监听的是80端口和使用http协议,假设浏览器访问 “www.test.com/index” ,那么默认构造的location url便是 “www.test.com/index/” ,并且api网关会直接将该响应写回给浏览器。浏览器收到301状态码的响应后,解析出响应头的location值,然后进行跳转。过程如下图所示:

2.凯发k8官方网的解决方案

最简便的解决方法便是,设置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/;}} 复制代码

这样以后,对于 "www.test.com/index" 的请求,location响应头的值将等于 /index/。

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是凯发k8官方网为你收集整理的nginx 301跳转踩坑总结的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图