跳到主要内容

Nginx 重写规则

Nginx是一个高性能的Web服务器和反向代理服务器,广泛用于处理HTTP请求。URL重写是Nginx中一个强大的功能,允许开发者根据特定规则修改请求的URL。通过URL重写,可以实现更友好的URL结构、重定向旧URL到新URL,或者隐藏后端服务器的真实路径。

本文将逐步介绍Nginx重写规则的基本语法、常见用法以及实际应用场景,帮助初学者快速掌握这一功能。


什么是Nginx重写规则?

Nginx重写规则是通过正则表达式匹配URL,并根据匹配结果对URL进行修改或重定向的机制。它通常用于以下场景:

  1. 优化URL结构:将复杂的URL转换为更简洁、易读的形式。
  2. 重定向旧URL:将旧的URL重定向到新的URL,以保持SEO排名或用户体验。
  3. 隐藏后端路径:隐藏服务器端的真实路径,增强安全性。

Nginx的重写规则主要通过 rewrite 指令实现。


基本语法

Nginx的 rewrite 指令语法如下:

nginx
rewrite regex replacement [flag];
  • regex:用于匹配URL的正则表达式。
  • replacement:匹配成功后替换的目标URL。
  • flag:可选参数,用于指定重写的行为。常见的flag包括:
    • last:停止处理当前的重写规则,并使用新的URL重新匹配其他规则。
    • break:停止处理当前的重写规则,并直接使用新的URL。
    • redirect:返回302临时重定向。
    • permanent:返回301永久重定向。

示例1:简单的URL重写

假设我们希望将 /old-page 重写为 /new-page,可以使用以下规则:

nginx
rewrite ^/old-page$ /new-page permanent;
  • 输入URLhttp://example.com/old-page
  • 输出URLhttp://example.com/new-page
备注

permanent 表示永久重定向(301),浏览器会缓存此重定向,下次访问时会直接跳转到新URL。


示例2:动态URL重写

假设我们希望将 /product/123 重写为 /product?id=123,可以使用以下规则:

nginx
rewrite ^/product/(\d+)$ /product?id=$1 last;
  • 输入URLhttp://example.com/product/123
  • 输出URLhttp://example.com/product?id=123
提示

(\d+) 是一个正则表达式,用于匹配数字。$1 表示第一个捕获组的内容(即 123)。


示例3:条件重写

Nginx还支持根据条件进行重写。例如,我们希望仅当请求来自特定IP地址时才重写URL:

nginx
if ($remote_addr = "192.168.1.100") {
rewrite ^/restricted$ /allowed last;
}
  • 输入URLhttp://example.com/restricted
  • 输出URLhttp://example.com/allowed(仅当客户端IP为 192.168.1.100 时)
警告

过度使用 if 指令可能会导致性能问题,建议仅在必要时使用。


实际应用场景

场景1:重定向旧URL到新URL

假设网站进行了重构,旧的URL /blog/2022/01/01/my-post 需要重定向到新的URL /posts/my-post,可以使用以下规则:

nginx
rewrite ^/blog/\d{4}/\d{2}/\d{2}/(.*)$ /posts/$1 permanent;
  • 输入URLhttp://example.com/blog/2022/01/01/my-post
  • 输出URLhttp://example.com/posts/my-post

场景2:隐藏文件扩展名

假设我们希望隐藏 .php 扩展名,将 /about.php 重写为 /about

nginx
rewrite ^/(.*)\.php$ /$1 last;
  • 输入URLhttp://example.com/about.php
  • 输出URLhttp://example.com/about

总结

Nginx重写规则是一个强大的工具,可以帮助开发者优化URL结构、实现重定向以及隐藏后端路径。通过本文的学习,你应该已经掌握了以下内容:

  1. Nginx重写规则的基本语法。
  2. 如何使用正则表达式匹配和替换URL。
  3. 常见的重写场景和实际应用。

附加资源与练习

资源

练习

  1. 尝试将 /user/123/profile 重写为 /profile?id=123
  2. 实现一个规则,将所有 .html 文件重写为对应的 .php 文件。

通过实践,你将更深入地理解Nginx重写规则的强大功能!