【Nginx07】Nginx学习:HTTP核心模块(四)错误页面与跳转

news2024/9/22 5:32:18

Nginx学习:HTTP核心模块(四)错误页面与跳转

最最核心的部分学习完了,但其实还有更多的内容要等待着我们探索。今天我们先来看到的就是关于错误页面的设置以及 301、302 跳转相关的内容。这两块内容都有一个特点,那就是页面或明显地,或不明显地产生了跳转变化,显示的都不是本来我们应该要得到的那个链接的页面。

error_page

这个指令应该是比较常见了吧,为指定错误定义显示的URI。

error_page code ... [=[response]] uri;

当前配置级别没有 error_page 指令时,将从上层配置继承, URI 可以包含变量。一般对于错误页面,我们想要友好提示,都会准备一些静态或动态页面,比如说网上有包含很多设计元素的 404 页面模板。code 可以设置多个,=response 可以修改返回的响应码,最后的 uri 就是我们要最终显示哪个 uri 页面。先来看看默认的 Nginx 错误页面的配置是啥样的吧。

#error_page  404              /404.html;

error_page   500 502 503 504  /50x.html;
location = /50x.html {
  root   html;
}

刚安装完的自带的 Server 中,默认的 error_page 就是这两个配置,404 是被注释起来的。而 500 提供了一个 50x.html 在默认的 html 目录下。我们直接来访问试下,先访问一个不存在的静态页面。

d0a47f681f16326dfc39cf4aa1945ad2.png

然后再访问一个会报 500 错误的 php 页面。这个 PHP 代码就不粘出来了,就是 thorw new Exception(); 抛出了一个异常。

f1971e8561312c71e8b4157d486d3ed9.png

需要注意的是一点是,在访问 php 页面时,需要配置 php 中的参数,保证 fastcgi_intercept_errors是 on 的,否则 Nginx 不会处理 php 的错误信息。

location ~ \.php$ {
  root html;

  fastcgi_pass unix:/var/sock/php-fpm/www.sock;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

  include        fastcgi_params;
  fastcgi_intercept_errors on;  # 需要这个保持 on 状态
}

看出来了吧,默认情况下 404 确实是没有页面的,而 500 页面也走的是 html 目录下的那个 50x.html 。现在我们来配置几个页面。

// 404.html
this is 404 page.

// 404.php
<?php
echo "php 404";

// 50x.php
<?php
echo "php 50x";

普通配置

默认全局的 404 我们就直接打开原始配置中的 404 注释的部分就好了。现在访问之前的那个不存在的 URL 就会看到已经走到我们新建的那个 404.html 页面了。

d1f95f4833a980786057c8774e9d20c9.png

error_page 是有层级的,前面已经说过了,现在我们在一个 location 中配置一个 404 的 error_page ,那么访问这个 location 就会走这里的 error_page 设置。

location /errtest1/ {
  error_page 404 /404.php;
}

上面的配置可以让 /errortest1 这个路径的访问返回的是 404.php 的错误展示页面。

e30cd8bad4873a6253d0494387a02bb4.png

跳转配置

跳转配置指的是可以跳转到指定的页面,在这里我们会用到 =response 参数。

location /errtest2/ {
  error_page 404 @notfound;
}

location /errtest3/ {
  error_page 404 =301 http://www.baidu.com;
}

location @notfound {
  return 301 /index.html;
}

访问 /errtest2/ 会打开首页,这里还使用到了 location 的命名路径功能。另外一个 /errtest3/ 则会直接 301 跳转到百度的首页。这两个就不截图了,大家可以自己试下哦。

PHP配置

对于 PHP 来说,其实也就是在 location 中配置 error_page 的效果,在这里我们将 500 系列的指向了 50x.php 文件,404 指向了 404.php 文件。特别注意的就是 fastcgi_intercept_errors 需要开启,这个前面已经说过了。

location ~ \.php$ {
  root html;

  error_page 500 501 502 503 /50x.php;
  error_page 404 =200 /404.php;
  fastcgi_pass unix:/var/sock/php-fpm/www.sock;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
  fastcgi_intercept_errors on;
}

另外,只要 location 中有一个 error_page 了,那么外层的 error_page 就不管用了。什么意思呢?把上面 404 的注释掉,然后再次访问一个不存在的 php 页面,得到的结果是这样的。

5ac474ecc31c0d84d169b39019bd8bdc.png

这是由 fastcgi 接管的 404 报错页面,会显示 File not found. (如果没有开启 fastcgi_intercept_errors 的话,也会一直显示这个)

连续报错测试

连续报错是指假设我们指定的报错 URI 也不存在,会产生什么效果呢?这时,Nginx 会以最后获得的状态码为准。还是拿 404 来测试。

error_page  404              /404444.html;

我们将全局的 404 报错页面修改为一个不存在的文件,那么最后返回的错误页面又会变成最前面我们看到的那个 Nginx 默认的 404 页面。

76eea3a2cf8a4545dc12c7094c9fe5f4.png

如果不修改全局的,只是修改 /errtest1/ 的配置,那么最终也会显示这个 Nginx 默认的 404 错误页面,这个大家可以自己尝试一下哦。

跳转重定向

这里所说的跳转,主要指的就是 301 或者 302 的跳转。HTTP 的基础就不多说了,这个 301、302 也不算特别偏门的知识,这里的配置主要影响的就是在 301 或者 302 时返回的响应头中,Location 的变化情况。跳转相关的配置项都可以用于 http、server、location 各个模块中。

absolute_redirect

第一个配置指令。

absolute_redirect on | off;

它可以作用于 http,server,location 模块, 默认值是 on ,如果禁用的话,Nginx 发出的重定向将是相对的。这是啥意思呢?其实就是相对路径和绝对路径的问题。我们先随便设置一个 301 跳转的路径。

// nginx.conf http..server...
location /t {
    return 301 /index.html;
}

上面的配置是在默认的那个 server 下面添加的一个 location ,然后直接 return 返回一个 301 跳转页面,其实就是直接又跳回首页了。现在我们可以使用浏览器或者 Postman 进行测试,主要就是看访问这个 /t 路径时,返回的响应头中的 Location 属性。默认情况,它是这样的。

// 访问 http://192.168.56.88/t
Location: http://192.168.56.88/index.html

没啥问题吧,接下来将 absolute_redirect 修改成 off 。

// nginx.conf http
absolute_redirect off;

我们直接在 http 下面配置指这个令,然后 reload 重载配置,之后再次去访问 /t 路径。

// 访问 http://192.168.56.88/t
Location: /index.html

看出来不同了吧,现在 Location 返回的结果没有了前面的 Host 信息,就是我们在 return 中定义的那个相对路径了。

这个指令出现在 1.11.8 版本,和它一起打配合的还有后面两个指令,另外还需要注意的一点是,如果我们重定向本身就是带有 Host 信息的,比如:

return 301 http://192.168.56.88/index.html

那么这几个配置指令就没啥效果了,因为我们已经写死了固定的跳转绝对路径。

server_name_in_redirect

这个配置指令是用于确定要不要用 server_name 来做为跳转时的 Host 部分。

server_name_in_redirect on | off;

啥意思呢?首先,默认值是 off ,在默认的情况下,Nginx 会以请求头中的 Host 字段为基础,其实就是我们访问 URL 的 HOST 部分啦。这样在跳转链接的时候,如果 absolute_redirect 是 on,并且  return中也不是绝对路径的话,就会自动将 HOST 添加上,组成完整的 URL 。

如果将它配置成 on ,那么就会忽略请求头中的 Host ,而是直接使用当前 server 下面的 server_name 这个配置属性。

// nginx.conf http...server...
server_name  localhost;

在测试环境中,默认的那个 server 配置的 server_name 的值是 localhost 。然后,我们将 server_name_in_redirect 设置为 on ,接下来 reload 配置再次进行测试。

// 访问 http://192.168.56.88/t
Location: http://localhost/index.html

看出来效果了吧,不管你请求是 IP ,还是指定一个域名或者怎么样,它始终会返回 server_name 定义的内容,那么如果有多个 server_name 呢?

// nginx.conf http...server...
server_name  core.nginx.test localhost

// 访问 http://192.168.56.88/t
Location: http://core.nginx.test/index.html

它返回的是第一个 server_name 的值。

port_in_redirect

从名字就能看出,这个配置应该是和端口有关系,它是控制重定向跳转时带不带上原来的端口。

port_in_redirect on | off;

默认值是 on ,表示请求过来的是哪个端口,跳转时也带上哪个端口。在测试时,我们先给 server 添加一个监听的端口,比如加一个 8080 ,然后正常访问 8080 端口的链接。(默认 80 端口的看不出效果,因为 80 端口会直接省略掉)

// 访问 http://192.168.56.88:8080/t
Location: http://192.168.56.88:8080/index.html

然后,我们将这个配置项设置成 off 。再次请求。

// 访问 http://192.168.56.88:8080/t
Location: http://192.168.56.88/index.html

看出来效果了吧,这回转发就没有带上端口了,直接走默认的 80 端口了。

总结

今天的内容不难,也不复杂,和前面两篇比起来简直太轻松了吧。而且,error_page 和 return 跳转这种操作也是非常基本的操作。不少的同学也早就已经用过了,而且可能比我知道的还要更多。因此,也就不多献丑了,先了解,再深入,更多好玩的用法和配置还等着我们继续学习呢!

参考文档:

http://nginx.org/en/docs/http/ngx_http_core_module.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

一、项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议&#xff0c;能够实时监测环境的温度和湿度&#xff0c;并将数据通过LCD显示屏显示出来&#xff1b;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域…

路径规划算法:基于白冠鸡优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于白冠鸡优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于白冠鸡优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

leetcode 74. 搜索二维矩阵(java)

搜索二维矩阵 leetcode 74. 搜索二维矩阵题目描述抽象BST代码演示 抽象BST leetcode 74. 搜索二维矩阵 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/search-a-2d-matrix 题目描述 给你一个满足下述两条属性的 m x n 整…

033、TiDB特性_AUTO_INCREMENT

自增列 实现原理使用限制相关参数示例 实现原理 每一个自增列使用一个全局可见的键值对用于记录当前已分配的最大ID为了降低分布式系统分配自增ID的网络开销&#xff0c;每个TiDB节点会缓存一个不重复的ID段当前预分配的ID段使用完毕&#xff0c;或重启&#xff0c;都会重新再…

【数据结构导论】第 6 章:查找

目录 一、基本概念 二、静态查找表 &#xff08;1&#xff09;顺序表上的查找 —— 顺序查找 ① 过程 ② 算法 ③ 算法分析 &#xff08;2&#xff09;有序表上的查找 —— 二分查找 ① 二分查找思想 ② 二分查找过程 ③ 二分查找算法 ④ 示例 ⑤ 算法分析 &#…

CentOS系统内核升级(在线 离线)

centos7.x默认内核版本3.10.x&#xff0c;在安装docker时&#xff0c;部分功能&#xff08;如 overlay2 存储层驱动&#xff09;无法使用&#xff0c;并且部分功能可能不太稳定。所以建议大家升级到最新的稳定内核版本。 在线升级 1. 查看当前内核版本 uname -sr Linux 3.10…

python脚本编译成exe方式进行交付

Python自动化办公越来越方便&#xff0c;我们经常也会利用python来写一些自动化的小脚本&#xff0c;例如批量处理文档&#xff0c;自动发送邮件等等。 也许是平时吹得牛比较多&#xff0c;有一天秦医生就问起我说能不能给她写一个自动化处理生信数据的小脚本。 这当然是毫无问…

Stable Diffusion - 扩展插件 (Extensions) 功能的配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131576762 Prompt: (masterpiece, top quality, best quality, ((standing in centre)), ((1girl, black hair)), ((upper body, symmetrical com…

视频无损放大修复工具:Topaz Video AI对Mac和Windows的系统要求

Topaz Video AI是一款基于人工智能技术的视频增强软件&#xff0c;旨在提供高质量的视频修复、增强和转换功能。它可以通过智能算法和图像处理技术&#xff0c;改善视频的清晰度、稳定性、降噪效果&#xff0c;还能进行视频转码和格式转换。 Mac&#xff1a;Topaz Video AI fo…

[pyqt5]designer设计界面设计工具栏上图标和文字同时显示

打开设计师界面 右侧先选择toolBar然后去属性找到toolButtonStyle设置对应选项即可。

图扑 AR 技术应用与管理:施工建造、机柜扫描、办公室导航解决方案

随着科技的不断革新和创新&#xff0c;越来越多的行业开始迎来数字化时代的变革。建筑行业作为人类历史上最重要的产业之一&#xff0c;在数字化转型方面同样也在不断推进。图扑软件结合 AR 技术的应用&#xff0c;为建筑行业带来了更加便捷高效的建筑施工过程管理。 传统的建筑…

MathType7.4中文版下载安装教程

MathType7.4版是一款功能强大、专业实用、应用范围广的数学公式编辑器软件&#xff0c;这款软件采用了简体中文操作界面并且完美兼容office、wps等一系列常见办公工具&#xff0c;这样就能够很好的为相关用户省去了许多繁琐的操作步骤&#xff0c;用户在这里可以轻轻松松进行公…

使用Pytorch加载预训练模型及修改网络结构

Pytorch有自带的训练好的AlexNet、VGG、ResNet等网络架构。详见官网 1.加载预训练模型 import torch import torchvision import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision.transforms as transforms import torchvis…

VBA系列技术资料MF33:VBA_将文本文件转换为Excel

【分享成果&#xff0c;随喜正能量】一心热枕对待生活&#xff0c;静静的安抚自己内心的急迫和焦虑&#xff0c;你人生的好运&#xff0c;常常在你沉醉于生活时悄悄临门的。。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高…

vue本地开发集成https

背景&#xff1a;在本地项目开发中&#xff0c;调用第三方服务获取音视频通话&#xff0c;音视频通话是采用 WebRTC 来实现的&#xff0c;而 WebRTC 中使用音视频设备进行取流是需要在安全域下才可以调起的设备权限 解决方案&#xff1a;使用npm安装mkcert&#xff0c;配置证书…

spring boot+MySQL实现学习平台

本次设计任务是要设计一个学习平台&#xff0c;通过这个系统能够满足学习信息的管理及学生和教师的学习管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程信息管理&#xff0c;类型管理&#xff0c;作业信息管理…

Hive(18):DML之Load加载数据

1 背景 回想一下,当在Hive中创建好表之后,默认就会在HDFS上创建一个与之对应的文件夹,默认路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse。 要想让hive的表和结构化的数据文件产生映射,就需要把文件移到到表对应的文件夹下面,当然,可以在…

天天刷题-->LeetCode(无重复字符的最长字串)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

轻松学会Java导出word,一篇文章就够了!

很多小伙伴在工作中&#xff0c;可能又这样一个需求&#xff1a;根据word模板去填充数据&#xff0c;变成我们想要的word文档&#xff0c;这是很多刚进入职场的小白都会碰到的需求。 当遇上这种需求&#xff0c;我们可以通过这篇文章要讲的poi-tl 来做处理。 导入依赖 <dep…

下载pycharm专业版

PyCharm: the Python IDE for Professional Developers by JetBrainsThe Python & Django IDE with intelligent code completion, on-the-fly error checking, quick-fixes, and much more...https://www.jetbrains.com/pycharm/Pycharm安装使用与版本切换_pycharm专业版换…