跳到主要内容

Nginx 重写指令

介绍

Nginx是一个高性能的Web服务器和反向代理服务器,广泛用于处理HTTP请求。在实际应用中,我们经常需要修改或重写URL,以便更好地控制请求的流向或优化SEO。Nginx的rewrite指令正是为此而设计的。

rewrite指令允许你根据特定的规则修改请求的URL,并将请求重定向到新的URL。这在处理旧URL迁移、简化URL结构或实现动态URL重写时非常有用。

基本语法

rewrite指令的基本语法如下:

nginx
rewrite regex replacement [flag];
  • regex:一个正则表达式,用于匹配请求的URL。
  • replacement:匹配成功后,URL将被替换为这个值。
  • flag:可选参数,用于指定重写的行为。常见的flag包括:
    • last:停止处理当前的重写规则,并重新开始匹配新的URL。
    • break:停止处理当前的重写规则,并继续处理其他指令。
    • redirect:返回302临时重定向。
    • permanent:返回301永久重定向。

示例1:简单的URL重写

假设我们希望将所有访问/old-page的请求重定向到/new-page,可以使用以下配置:

nginx
server {
listen 80;
server_name example.com;

location /old-page {
rewrite ^/old-page$ /new-page permanent;
}
}

输入http://example.com/old-page
输出:浏览器将被重定向到http://example.com/new-page,并返回301状态码。

备注

permanent标志表示这是一个永久重定向(301),浏览器会缓存这个重定向结果,下次访问时会直接跳转到新URL。

示例2:动态URL重写

假设我们有一个动态URL结构,例如/product/123,我们希望将其重写为/product?id=123。可以使用以下配置:

nginx
server {
listen 80;
server_name example.com;

location /product {
rewrite ^/product/(\d+)$ /product?id=$1 break;
}
}

输入http://example.com/product/123
输出:请求将被重写为http://example.com/product?id=123,但浏览器地址栏不会改变。

提示

break标志表示重写后不会继续匹配其他规则,而是直接处理重写后的URL。

实际应用场景

场景1:旧URL迁移

假设你的网站进行了重构,旧的URL结构不再适用。你可以使用rewrite指令将旧URL重定向到新URL,以确保用户不会遇到404错误。

nginx
server {
listen 80;
server_name example.com;

rewrite ^/old-blog/(.*)$ /new-blog/$1 permanent;
}

输入http://example.com/old-blog/my-post
输出:浏览器将被重定向到http://example.com/new-blog/my-post

场景2:强制HTTPS

为了确保所有流量都通过HTTPS传输,你可以使用rewrite指令将所有HTTP请求重定向到HTTPS。

nginx
server {
listen 80;
server_name example.com;

rewrite ^(.*)$ https://example.com$1 permanent;
}

输入http://example.com
输出:浏览器将被重定向到https://example.com

总结

Nginx的rewrite指令是一个非常强大的工具,可以帮助你灵活地处理URL重写和重定向。通过正则表达式和不同的flag,你可以实现从简单的URL重写到复杂的动态URL处理。

在实际应用中,rewrite指令常用于旧URL迁移、强制HTTPS、简化URL结构等场景。掌握rewrite指令的使用,将大大提升你对Nginx配置的掌控能力。

附加资源与练习

  • 练习1:尝试配置一个Nginx服务器,将所有访问/about-us的请求重定向到/about
  • 练习2:使用rewrite指令实现一个动态URL重写,将/user/123重写为/user?id=123
警告

在使用rewrite指令时,务必小心正则表达式的编写,避免因错误的匹配规则导致意外的重定向或循环重定向。