设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 你是我生命中所能经历的,最最深切的感觉。

你是我生命中所能经历的,最最深切的感觉。

查看: 626|回复: 3

在Nginx中实现URL重写与重定向

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:231
  • 打卡月天数:0
  • 打卡总奖励:3681
  • 最近打卡:2025-06-26 17:09:21
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
411
主题
390
精华
0
金钱
4927
积分
863
注册时间
2023-1-21
最后登录
2025-6-26

发表于 2025-1-21 03:27:33 | 显示全部楼层 |阅读模式
目录


  • URL 重写(Rewrite)
  • Nginx 中的 URL 重写指令

    • rewrite 指令
    • try_files 指令

  • 常见的 URL 重写场景

    • 实现 301/302 重定向
    • 将非 www 域名重定向到 www 域名
    • URL 正则重写:简化 URL 结构
    • 动态 URL 重写:参数化查询
    • 404 页面重定向
    • 结合正则表达式进行动态 URL 重写


URL 重写(Rewrite)

Nginx 的 **URL 重写(Rewrite)**功能允许你根据请求的 URL 动态地修改请求路径或进行重定向。通过 URL 重写,你可以实现诸如:

  • 友好 URL:将复杂的 URL 转换为简洁、易记的形式。
  • 301/302 重定向:实现页面永久或临时重定向。
  • 条件重写:基于不同的条件(如请求头、IP 地址、用户代理等)修改请求路径。
本文将详细介绍如何在 Nginx 中实现 URL 重写,并给出一些常见的实际场景。

Nginx 中的 URL 重写指令

Nginx 中的 URL 重写主要依赖于两个指令:

    1. rewrite
    复制代码
    :用于修改请求的 URL。
    1. try_files
    复制代码
    :尝试一系列的文件路径,并在文件不存在时重写 URL。

rewrite 指令

rewrite 指令允许你根据正则表达式重写 URL。其基本语法如下:
  1. rewrite <匹配规则> <重写目标> [标志];
复制代码

  • 匹配规则:正则表达式,匹配请求的 URL。
  • 重写目标:新的 URL,符合规则时,Nginx 会将请求的 URL 重写为这个目标。
  • 标志(可选):控制重写的行为,常见的标志有:

      1. last
      复制代码
      :表示重新搜索新的 location 块(即继续匹配新的规则)。
      1. break
      复制代码
      :停止当前 location 块中的规则匹配,执行后续指令。
      1. redirect
      复制代码
      :执行临时重定向(302)。
      1. permanent
      复制代码
      :执行永久重定向(301)。

这里举个例子:
  1. rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last;
复制代码
可以分解为:

    1. ^/archive/(\d{4})/(\d{2})/(\d{2})$
    复制代码
    :这是一个正则表达式,表示匹配
    1. /archive/
    复制代码
    后跟着年份、月份和日期的 URL。具体匹配:

      1. ^
      复制代码
      表示匹配 URL 的开始;
      1. /archive/
      复制代码
      是固定的路径部分;
      1. (\d{4})
      复制代码
      匹配 4 位数字(年份);
      1. (\d{2})
      复制代码
      匹配 2 位数字(月份);
      1. (\d{2})
      复制代码
      匹配 2 位数字(日期);
      1. $
      复制代码
      表示匹配 URL 的结尾。

    1. /archive?year=$1&month=$2&day=$3
    复制代码
    :这是重写后的目标 URL。这里使用了捕获组的替换:

      1. $1
      复制代码
      被替换为第一个捕获组(即年份)。
      1. $2
      复制代码
      被替换为第二个捕获组(即月份)。
      1. $3
      复制代码
      被替换为第三个捕获组(即日期)。
    • 最终重写的 URL 是
      1. /archive?year=2024&month=03&day=25
      复制代码


    1. last
    复制代码
    :这个标志表示 Nginx 会停止当前的
    1. rewrite
    复制代码
    匹配,并继续重新匹配请求的新 URL(即
    1. /archive?year=2024&month=03&day=25
    复制代码
    )。
  1. 首先来看这部分正则表达式:[code](\d{4})/(\d{2})/(\d{2})
复制代码


    1. (\d{4})
    复制代码


      1. \d
      复制代码
      是一个正则表达式元字符,表示匹配 数字字符,即 0-9 的任意数字。
      1. {4}
      复制代码
      是量词,表示前面的表达式(这里是
      1. \d
      复制代码
      )必须出现 4 次
    • 因此,
      1. (\d{4})
      复制代码
      匹配 4 位数字,通常用来表示年份(比如 2024)。

    1. /(\d{2})
    复制代码


    • 同理,
      1. (\d{2})
      复制代码
      匹配 2 位数字,通常用来表示月份(如
      1. 03
      复制代码
      )或日期(如
      1. 25
      复制代码
      )。
    • 这里的
      1. \d{2}
      复制代码
      匹配的是 2 个数字,表示月份或日期。

    1. /(\d{2})
    复制代码


    • 这个部分与上面相同,匹配的是 2 位数字,通常表示日期部分。

综合起来:
  1. (\d{4})/(\d{2})/(\d{2})
复制代码
就是用来匹配像
  1. /2024/03/25
复制代码
这样的 URL,具体来说:

  • 第一部分
    1. (\d{4})
    复制代码
    匹配年份部分(例如 2024)。
  • 第二部分
    1. (\d{2})
    复制代码
    匹配月份部分(例如 03)。
  • 第三部分
    1. (\d{2})
    复制代码
    匹配日期部分(例如 25)。
  1. ()
复制代码
作用:括号
  1. ()
复制代码
用来 捕获匹配的内容。捕获的内容可以通过
  1. $1
复制代码
,
  1. $2
复制代码
,
  1. $3
复制代码
来引用。这是正则表达式中的“捕获组”(capture groups)。在示例中,
  1. (\d{4})
复制代码
  1. (\d{2})
复制代码
  1. (\d{2})
复制代码
就是捕获组,分别捕获年份、月份和日期。
  1. $1
复制代码
  1. $2
复制代码
  1. $3
复制代码
是什么意思?在正则表达式中,捕获组(即
  1. ()
复制代码
中匹配的内容)会按顺序赋予数字标识。

    1. $1
    复制代码
    :引用第一个捕获组(这里是
    1. (\d{4})
    复制代码
    ),即年份部分。
    1. $2
    复制代码
    :引用第二个捕获组(这里是
    1. (\d{2})
    复制代码
    ),即月份部分。
    1. $3
    复制代码
    :引用第三个捕获组(这里是
    1. (\d{2})
    复制代码
    ),即日期部分。
假设请求的 URL 是
  1. /archive/2024/03/25
复制代码
,在
  1. rewrite
复制代码
指令中,
  1. (\d{4})
复制代码
将捕获到
  1. 2024
复制代码
  1. (\d{2})
复制代码
捕获到
  1. 03
复制代码
,另一个
  1. (\d{2})
复制代码
捕获到
  1. 25
复制代码


    1. $1
    复制代码
    就是
    1. 2024
    复制代码
    (第一个捕获组)。
    1. $2
    复制代码
    就是
    1. 03
    复制代码
    (第二个捕获组)。
    1. $3
    复制代码
    就是
    1. 25
    复制代码
    (第三个捕获组)。
[/code]
try_files 指令

try_files 用于检查一系列文件是否存在,如果文件存在则继续处理,否则进行 URL 重写。它常用于静态资源的处理,例如检查文件是否存在,如果不存在,则重写请求到某个页面(通常是首页或错误页面)。
  1. try_files <文件1> <文件2> ... <重写目标>;
复制代码
常见的 URL 重写场景


实现 301/302 重定向

当你需要将旧 URL 重定向到新 URL 时,
  1. rewrite
复制代码
指令非常有用。301 是永久重定向,告诉搜索引擎这个页面已经被永久移动;302 是临时重定向,表示页面将暂时被移动到新的 URL。
示例:将
  1. http://example.com/old-page
复制代码
重定向到
  1. http://example.com/new-page
复制代码
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     location /old-page {
  5.         rewrite ^/old-page$ /new-page permanent;
  6.     }

  7.     location /new-page {
  8.         # 处理新页面的配置
  9.     }
  10. }
复制代码
配置解释:

    1. rewrite ^/old-page$ /new-page permanent;
    复制代码
    :将
    1. /old-page
    复制代码
    重定向到
    1. /new-page
    复制代码
    ,并使用永久重定向(301)。
    1. permanent
    复制代码
    标志表示这是一个永久性重定向。

将非 www 域名重定向到 www 域名

如果你希望所有请求都通过
  1. www.example.com
复制代码
访问,可以使用 Nginx 重定向非 www 域名的请求。
示例:将
  1. example.com
复制代码
重定向到
  1. www.example.com
复制代码
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     # 进行 301 重定向
  5.     return 301 http://www.example.com$request_uri;
  6. }

  7. server {
  8.     listen 80;
  9.     server_name www.example.com;

  10.     location / {
  11.         # 正常的站点配置
  12.     }
  13. }
复制代码
配置解释:

    1. return 301 http://www.example.com$request_uri;
    复制代码
    :将所有
    1. example.com
    复制代码
    的请求重定向到
    1. www.example.com
    复制代码
    ,并保留请求的 URI。

URL 正则重写:简化 URL 结构

你可以使用正则表达式对 URL 进行重写,使 URL 更加简洁、符合 SEO 标准。
示例:将
  1. /category/id/123
复制代码
重写为
  1. /category/123
复制代码
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     location /category/id/ {
  5.         rewrite ^/category/id/(\d+)$ /category/$1 last;
  6.     }
  7. }
复制代码
配置解释:

    1. rewrite ^/category/id/(\d+)$ /category/$1 last;
    复制代码
    :将
    1. /category/id/123
    复制代码
    重写为
    1. /category/123
    复制代码
    ,并使用
    1. last
    复制代码
    标志继续匹配新的
    1. location
    复制代码
    块。

动态 URL 重写:参数化查询

如果你的网站 URL 需要支持动态查询参数,可以使用
  1. rewrite
复制代码
指令根据 URL 参数进行重写。
示例:将
  1. /search?q=keyword
复制代码
重写为
  1. /search/keyword
复制代码
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     location /search {
  5.         rewrite ^/search\?q=(\w+)$ /search/$1 last;
  6.     }
  7. }
复制代码
配置解释:

    1. rewrite ^/search\?q=(\w+)$ /search/$1 last;
    复制代码
    :将
    1. /search?q=keyword
    复制代码
    重写为
    1. /search/keyword
    复制代码
    ,并使用
    1. last
    复制代码
    标志继续匹配新的
    1. location
    复制代码
    块。

404 页面重定向

当请求的文件或页面不存在时,你可能希望将请求重定向到一个自定义的 404 页面或者首页。可以通过
  1. try_files
复制代码
指令实现。
示例:当请求的文件不存在时,重定向到
  1. index.html
复制代码
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     location / {
  5.         try_files $uri $uri/ /index.html;
  6.     }
  7. }
复制代码
配置解释:

    1. try_files $uri $uri/ /index.html;
    复制代码
    :Nginx 将首先检查请求的文件是否存在,如果不存在,则将请求重写为
    1. /index.html
    复制代码


结合正则表达式进行动态 URL 重写

Nginx 支持强大的正则表达式匹配功能,可以用来处理更复杂的 URL 重写需求。以下是一个更复杂的 URL 重写示例,结合条件和正则表达式来进行动态路由。
示例:根据日期重写 URL
  1. server {    listen 80;    server_name example.com;    location /archive/ {        rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last;    }}
复制代码
配置解释:

  • rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last;:将 /archive/2024/03/25 重写为 /archive?year=2024&month=03&day=25。
以上就是在Nginx中实现URL重写与重定向的详细内容,更多关于Nginx URL重写与重定向的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2025-1-22 12:13:14 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:20
  • 打卡月天数:0
  • 打卡总奖励:249
  • 最近打卡:2025-04-03 16:29:57
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
293
积分
48
注册时间
2023-1-7
最后登录
2025-4-3

发表于 2025-3-15 21:45:25 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
5
精华
0
金钱
28
积分
13
注册时间
2022-12-22
最后登录
2023-8-13

发表于 2025-3-31 23:08:51 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表