day45-nginx复杂跳转与https

发布于:2025-07-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

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配置文件

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服务

#检查配置文件
nginx -t

#重启
systemctl reload nginx

#检查端口
ss -lntup | grep nginx

4.3.4. 浏览器访问

http://www.zhubl.xyz
自动跳转
https://www.zhubl.xyz

4.4. 🔍监控

  • https证书是否过期,30天
#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. 🌈自建证书

#创建私钥 私钥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配置优化

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;
}


网站公告

今日签到

点亮在社区的每一天
去签到