重新认识 nginx 配置文件解析规则

简介: 重新认识 nginx 配置文件解析规则

需求

将除了

http://a.mengkang.net/read/(\d+)\.html
http://a.mengkang.net/simple/t(\d+)\.html

之外的请求都转发到https://mengkang.net首页。

尝试解决

server  {
        listen  80;
        server_name  a.mengkang.net;
        root  /xxx;
        index index.html index.htm index.php;
    
        set $go2dev "1";
        if ($uri ~ "^/read/(\d+)\.html") {
                set $go2dev "0";
        }

        if ($uri ~ "^/simple/t(\d+)\.html") {
                set $go2dev "0";
        }

        if ($go2dev = "1") {
                rewrite ^(.*)$  https://mengkang.net? permanent;
        }

        rewrite ^/read/(\d+)\.html /read.php?tid=$1;
        rewrite ^/simple/t(\d+)\.html$ /simple/?t$1.html break;        
}

测试发现

# 没问题
curl -LI http://a.mengkang.net/read/1.html 

# 跳转
curl -LI http://a.mengkang.net/simple/t1.html
HTTP/1.1 301 Moved Permanently
...
Location: https://mengkang.net

很诡异第一个判断生效了,第二个判断没有生效么?

问题排查

        if ($uri ~ "^/simple/t(\d+)\.html") {
-                set $go2dev "0";
+                rewrite ^(.*)$  https://baidu.com/?request_uri=$request_uri&uri=$uri? permanent;
        }

再访问http://a.mengkang.net/simple/t1.html跳转到了https://baidu.com。说明规则没有问题。请求信息如下

curl -LI http://a.mengkang.net/simple/t14743.html
HTTP/1.1 301 Moved Permanently
Server: Tengine
Date: Tue, 15 Oct 2019 10:51:06 GMT
Content-Type: text/html
Content-Length: 278
Connection: keep-alive
Location: https://baidu.com/?request_uri=/simple/t14743.html&uri=/simple/t14743.html

那问题到底出在哪呢?把刚刚的修改恢复,然后我在最后的跳转里增加一些日志,修改如下

        if ($go2dev = "1") {
-                rewrite ^(.*)$  https://mengkang.net? permanent;
+                rewrite ^(.*)$  https://mengkang.net?request_uri=$request_uri&uri=$uri? permanent;
        }

再次请求

curl -LI http://bbs.aliyun.com/simple/t14743.html
HTTP/1.1 301 Moved Permanently
Server: Tengine
Date: Tue, 15 Oct 2019 10:41:25 GMT
Content-Type: text/html
Content-Length: 278
Connection: close
Location: https://mengkang.net/?request_uri=/simple/t14743.html&uri=/simple/index.php

HTTP/1.1 200

似乎发现了问题症结所在,第一次的请求确实没有进入if ($go2dev = "1")判断,直到执行了

rewrite ^/simple/t(\d+)\.html$ /simple/?t$1.html break;

由重新匹配了一遍上面的规则,第二次匹配的时候,$uri发生了变化,不再是/simple/t14743.html而变成了/simple/index.php,所以进入最后的跳转规则里面。

只有把上面的规则做如下修改才不会导致循环匹配

- rewrite ^/simple/t(\d+)\.html$ /simple/?t$1.html break;
+ rewrite ^/simple/t(\d+)\.html$ /simple/index.php?t$1.html break;
目录
相关文章
|
7月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
766 87
|
9月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2191 1
|
10月前
|
网络协议 前端开发 应用服务中间件
nginxconf.sh 自动生成 nginx tcp 转发配置文件 conf
该脚本由 eisc.cn 开发,用于自动生成 Nginx 代理配置。它根据预设的域名、IP 和端口信息,为多个项目(如 www、work、sou 等)创建对应的 Nginx 配置文件,设置前端转发、端口对端口及后端转发规则,并生成日志和 301 跳转配置。支持自动创建 CGI 解析目录,确保各项目能够正确访问。运行时需具备 root 权限或使用 sudo。
337 9
|
11月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1688 12
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
594 5
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
198 12
|
存储 安全 网络协议
Elasticsearch 配置文件解析
【10月更文挑战第3天】Elasticsearch 配置文件解析
407 3
|
域名解析 网络协议 应用服务中间件
nginx server_name配置文件覆盖不生效
nginx server_name配置文件覆盖不生效
|
应用服务中间件 nginx
nginx 配置文件
nginx 配置文件
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
626 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇

推荐镜像

更多
  • DNS