day45-nginx复杂跳转与https

1. ✅nginx复杂跳转

  • 客户端ip不是内网(172.16/192.168)ip时,维护文件存在时,返回503或者错误页面

1.1. 📝修改配置文件

复制代码
server {
  listen 80;
  server_name re.linux.cn; 
  root /app/code/re/;
  set $flag 0;
  if (  $remote_addr  !~*  "^172.16|^192.168" ) {
    set $flag 1;
  }
  if ( -f /etc/nginx/weihu.txt  ) {
    set $flag  ${flag}1;  
  }
  if ( $flag = 11 ) {
    return 503;
    #return 302 http://re.oldboy.cn/error.html;
  }


  if ( $request_method  !~*  "GET|POST|HEAD" ) {
    return 405;
  }
  location / {
    index index.html;
  }
}

1.2. 📁创建维护文件

复制代码
touch /etc/nginx/weihu.txt

1.3. 🔄重启服务

复制代码
nginx -t
systemctl reload nginx

1.4. 🌏使用10网段访问

2. ✅nginx中的case语句

  • map类似shell中的case语句
  • 问题:配置nginx负载均衡监控检查功能check,后端web节点会产生大量的检查日志(访问日志)
  • 解决:web服务器上配置根据不同的UA进行判断
    • 如果UA是lb_check则不记录访问日志
    • 如果UA是其他的则记录访问日志
  • map做判断,access_log有个if选项

    access_log /var/log/nginx/lb_access.log main if=0或1; 0不记录

2.1. 📌map用法

复制代码
map $源变量 $目标变量 {
  default     值;
  条件1       值1;
  条件2       值2;
  ...
}
  • map 必须写在 http 块中。
  • 源变量 可以是任何内置变量或之前定义的变量(如 host, http_user_agent, request_method 等)。
  • $目标变量 是你自定义的新变量名。
  • default 表示默认值,当没有匹配时使用。

2.2. 📝修改配置文件

  • 判断UA

    map http_user_agent log {
    "~*lb_check|curl|wget" 0;
    default 1;
    }

    server {
    listen 80;
    server_name lb.linux.cn;
    root /app/code/lb/;
    access_log /var/log/nginx/lb-access.log main if=$log;
    error_log /var/log/nginx/lb-error.log notice;
    location / {
    index index.html;
    }
    }

2.3. 🔄重启服务

复制代码
nginx -t
systemctl reload nginx

2.4. 🔍测试

复制代码
1.web02上测试
curl -A lb_check -H Host:lb.oldboy.cn http://10.0.0.7
curl -A lb -H Host:lb.oldboy.cn http://10.0.0.7

2.web01上查看日志
tail -f /var/log/nginx/lb-access.log

3. ✅rewrite

  • 功能与return类似

在 Nginx 中,returnrewrite 都可以用于实现URL 重定向或跳转 ,但它们的功能、行为和适用场景完全不同。下面详细对比它们的区别:

3.1. 🧩基本概念

|--------------|----------------------------------------------|-----------------------------|
| 特性 | return | rewrite |
| 类型 | 控制流指令 | URL 重写指令 |
| 是否发送 HTTP 响应 | 是(直接返回响应) | 否(修改请求后继续处理) |
| 主要用途 | 立即返回状态码或跳转到新地址 | 修改 URL 路径,内部跳转或外部重定向 |
| 支持的状态码 | 支持所有标准 HTTP 状态码(如 200, 301, 302, 403, 404 等) | 仅支持 301、302、303、307、308 的跳转 |

3.2. 📌 用法详解与示例

3.2.1. 🔹 return:立即返回指定的 HTTP 响应

3.2.1.1. 语法:

复制代码
return [状态码] [重定向地址];

3.2.1.2. 示例 1:返回错误页面

复制代码
location /error {
    return 404;
}

3.2.1.3. 示例 2:301 永久重定向

复制代码
location = /old-page {
    return 301 https://example.com/new-page;
}

3.2.1.4. 示例 3:直接返回字符串内容(常用于调试)

复制代码
location /hello {
    return 200 "Hello World!";
}

3.2.1.5. 实例 4:return + 变量

复制代码
server {
  listen 80;
  server_name baidu.linux.cn;
  return 301 http://www.baidu.cn$request_uri;
}

⚠️ 注意:return 一旦执行,Nginx 就不会再处理后续的逻辑,而是立即返回响应

3.2.2. 🔹 rewrite:重写 URL,控制请求路径

3.2.2.1. 语法:

复制代码
rewrite 正则表达式 替换内容 [flag];
  • 支持正则匹配
  • 可以配合 break, last, redirect, permanent 等 flag 使用

|-----------------|----------------------------------|
| rewrite标记(flag) | |
| redirect | 302临时跳转,新旧地址都可以用 |
| permanent | 301永久跳转,旧地址SEO排名取消,只用新地址 |
| break | 类似exit,后面还有其他的可以匹配location不会继续匹配 |
| last | 类似continue结束当前匹配,进行下个location匹配 |

3.2.2.2. 示例 1:内部重写(不改变浏览器地址)

复制代码
rewrite ^/user/(\d+)$ /profile.php?id=$1 break;
  • 浏览器看到的是 /user/123,服务器实际处理的是 /profile.php?id=123

3.2.2.3. 示例 2:302 临时重定向

复制代码
rewrite ^/old-path$ /new-path redirect;
  • 返回 302,浏览器地址栏会变成 /new-path

3.2.2.4. 示例 3:301 永久重定向

复制代码
rewrite ^/old-blog/(.*)$ https://blog.example.com/$1 permanent;
  • 返回 301,适合 SEO 权重转移

3.3. 🧠 核心区别总结

|--------------|--------------|--------------------------|
| 对比项 | return | rewrite |
| 是否中断请求处理 | ✅ 是,立即返回响应 | ❌ 否,继续处理新的 URL |
| 是否可带响应体 | ✅ 可以自定义内容 | ❌ 不行,只能跳转或改写 URL |
| 是否支持正则 | ❌ 不支持 | ✅ 支持 |
| 是否可用于 URL 重写 | ❌ 不可做内部重写 | ✅ 可以做内部重写 |
| 是否更高效 | ✅ 更快,因为不继续处理 | ❌ 相对慢一点(需要重新匹配 location) |

3.4. 💡 使用建议

|------------------|----------------------------------------|
| 场景 | 推荐使用 |
| 需要立即返回错误或内容 | return |
| 需要做复杂的 URL 匹配和重写 | rewrite |
| 做 SEO 友好的永久跳转 | return 301rewrite ... permanent |
| 临时跳转测试 | return 302rewrite ... redirect |
| 内部路径映射(浏览器地址不变) | rewrite + break |

3.5. 🔍 综合对比示例

|-----------------------------------------|------------------------------|
| 配置 | 行为 |
| return 301 https://example.com; | 立即返回 301,浏览器跳转 |
| rewrite ^/old$ /new redirect; | 返回 302,跳转到 /new |
| rewrite ^/old$ /new break; | 不跳转,内部将 /old 映射为 /new 处理 |
| return 403; | 立即返回 403 错误 |
| rewrite ^/api/(.*)$ /v2/api/$1 break; | 内部重写 API 路径,浏览器无感知 |

4. ✅https(数字证书)

  • https == http over tls进行你加密
  • 网站,申请https证书文件.(公钥(证书),私钥)
  • 对外:一般申请/购买使用(网站,app,小程序)
  • 对内:自己创建

4.1. ☀️申请证书方式

  • 通过命令创建(自建证书),其他人访问,提示网站不安全.
  • 申请免费证书(有效期是3个月);阿里云,Let's Encrypt
  • 正式:购买
  • 证书根据加密与安全方式分类

4.2. 🌏阿里云上申请ssl证书

4.2.1. 在数字证书管理服务中选择ssl证书管理,点击立即购买

4.2.2. 选择个人测试证书,点击立即购买

4.2.3. 支付

4.2.4. 登录管理控制台

4.2.5. 创建证书

4.2.6. 输入域名,选择快速签发,提交审核

4.2.7. 审核通过后选择证书下载到电脑上

4.3. 🚀部署ssl证书

4.3.1. 将ssl证书存放到/etc/nginx/keys/目录下

4.3.2. 修改nginx配置文件

bash 复制代码
server {
  listen 80;
  server_name www.zhubl.xyz;
  return 302 https://www.zhubl.xyz$request_uri;
  access_log off;
}
server {
  listen 443 ssl http2;
  server_name www.zhubl.xyz   ;
  ssl_certificate     /etc/nginx/keys/zhubl.xyz.pem;
  ssl_certificate_key /etc/nginx/keys/zhubl.xyz.key;
  root /app/code/ssl/;
  location / {
    index index.html;
  }
}

4.3.3. 重启nginx服务

bash 复制代码
#检查配置文件
nginx -t

#重启
systemctl reload nginx

#检查端口
ss -lntup | grep nginx

4.3.4. 浏览器访问

bash 复制代码
http://www.zhubl.xyz
自动跳转
https://www.zhubl.xyz

4.4. 🔍监控

  • https证书是否过期,30天
bash 复制代码
#1.获取过期日期,转换为秒 
date_expire=`curl -s -v -o /dev/null https://www.jd.com|& grep 'expire date'|awk -F: '{print $2}'` 
date_expire_seconds=`date +%s -d "$date_expire"`
date_now_seconds=`date +%s`
days_left=`echo "($date_expire_seconds - $date_now_seconds )/86400 "|bc `

4.5. 🌈自建证书

bash 复制代码
#创建私钥 私钥server.key 
openssl genrsa -idea -out server.key 2048 

#根据私钥创建 证书 server.crt .pem证书 
openssl req -days 36500 -x509 -sha256 - nodes -newkey rsa:2048 -keyout server.key - out server.crt

5. ✅nginx配置优化

bash 复制代码
server {
  listen 443 ssl;
  keepalive_timeout 70;
  
  #指定ssl加密协议的版本 不要 加上TLSv1.0不安全. 
  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

  #加密算法. 需要排除不安全的算法
  #排除null空算法, md5算法 
  ssl_ciphers AES128- SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4- MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5;
  
  ssl_certificate /usr/local/nginx/conf/cert.pem;
  ssl_certificate_key /usr/local/nginx/conf/cert.key;
  
  #设置https 会话缓存 10MB大小的空间用于 存储缓存. 
  ssl_session_cache shared:SSL:10m;
  
  #超时时间 10分钟
  ssl_session_timeout 10m;
}
相关推荐
一只栖枝1 小时前
网络安全 vs 信息安全的本质解析:数据盾牌与网络防线的辩证关系关系
网络·网络安全·信息安全·it·信息安全认证
物联网老王2 小时前
Ubuntu Linux Cursor 安装与使用一
linux·运维·ubuntu
CertiK2 小时前
CertiK《Hack3d:2025年第二季度及上半年Web3.0安全报告》(附报告全文链接)
网络
艾伦_耶格宇3 小时前
【ACP】阿里云云计算高级运维工程师--ACP
运维·阿里云·云计算
一只小鱼儿吖4 小时前
进程代理单窗口单IP技术:原理、应用与实现
网络·网络协议·tcp/ip
稳联技术4 小时前
Ethernet IP与Profinet共舞:网关驱动绿色工业的智慧脉动
网络·网络协议·tcp/ip
一位摩羯座DBA4 小时前
Redhat&Centos挂载镜像
linux·运维·centos
学习3人组4 小时前
CentOS配置网络
linux·网络·centos
计算机毕设定制辅导-无忧学长4 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
weixin_307779134 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习