跳到主要内容

Nginx 重写案例

介绍

Nginx是一个高性能的HTTP服务器和反向代理服务器,广泛用于Web服务的部署。URL重写是Nginx中一个强大的功能,它允许你根据特定的规则修改请求的URL。这在处理旧URL的迁移、SEO优化、简化URL结构等方面非常有用。

URL重写通常通过rewrite指令来实现。rewrite指令允许你将一个URL重写为另一个URL,或者将请求重定向到其他位置。本文将逐步讲解Nginx的URL重写功能,并通过实际案例帮助你理解其应用。

基本语法

Nginx的rewrite指令的基本语法如下:

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

案例1:简单的URL重写

假设你有一个旧的URL结构,如下:

https://example.com/old-page

现在你想将其重写为新的URL结构:

https://example.com/new-page

你可以在Nginx配置文件中添加以下规则:

nginx
server {
listen 80;
server_name example.com;

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

解释

  • ^/old-page$:这是一个正则表达式,匹配URL路径/old-page
  • /new-page:这是替换的URL路径。
  • permanent:表示返回301永久重定向。

结果

当用户访问https://example.com/old-page时,Nginx会将其重定向到https://example.com/new-page,并返回301状态码。

案例2:动态URL重写

假设你有一个动态生成的URL,如下:

https://example.com/user/123

你想将其重写为:

https://example.com/profile?id=123

你可以在Nginx配置文件中添加以下规则:

nginx
server {
listen 80;
server_name example.com;

location /user {
rewrite ^/user/(\d+)$ /profile?id=$1 last;
}
}

解释

  • ^/user/(\d+)$:这是一个正则表达式,匹配以/user/开头,后面跟着一个或多个数字的URL路径。(\d+)捕获数字部分。
  • /profile?id=$1:这是替换的URL路径,$1表示捕获的第一个组(即数字部分)。
  • last:表示停止处理当前的重写规则,并使用新的URL重新匹配其他规则。

结果

当用户访问https://example.com/user/123时,Nginx会将其重写为https://example.com/profile?id=123,并继续处理其他规则。

案例3:条件重写

假设你想根据请求的User-Agent头来重写URL。例如,如果用户使用的是移动设备,你想将其重定向到移动版页面。

你可以在Nginx配置文件中添加以下规则:

nginx
server {
listen 80;
server_name example.com;

location / {
if ($http_user_agent ~* "(android|iphone)") {
rewrite ^(.*)$ /mobile$1 break;
}
}
}

解释

  • if ($http_user_agent ~* "(android|iphone)"):这是一个条件判断,检查User-Agent头是否包含androidiphone
  • rewrite ^(.*)$ /mobile$1 break:如果条件为真,将URL重写为/mobile开头的路径,并停止处理当前的重写规则。

结果

当用户使用移动设备访问https://example.com/时,Nginx会将其重写为https://example.com/mobile/

案例4:多级目录重写

假设你有一个多级目录结构的URL,如下:

https://example.com/category/subcategory/product

你想将其重写为:

https://example.com/product?category=category&subcategory=subcategory

你可以在Nginx配置文件中添加以下规则:

nginx
server {
listen 80;
server_name example.com;

location /category {
rewrite ^/category/([^/]+)/([^/]+)/([^/]+)$ /product?category=$1&subcategory=$2&product=$3 last;
}
}

解释

  • ^/category/([^/]+)/([^/]+)/([^/]+)$:这是一个正则表达式,匹配以/category/开头的URL路径,并捕获三个部分(categorysubcategoryproduct)。
  • /product?category=$1&subcategory=$2&product=$3:这是替换的URL路径,$1$2$3分别表示捕获的三个部分。
  • last:表示停止处理当前的重写规则,并使用新的URL重新匹配其他规则。

结果

当用户访问https://example.com/category/electronics/smartphones/iphone时,Nginx会将其重写为https://example.com/product?category=electronics&subcategory=smartphones&product=iphone

总结

Nginx的URL重写功能非常强大,可以帮助你灵活地处理各种URL转换需求。通过本文的案例,你应该已经掌握了如何使用rewrite指令来实现简单的URL重写、动态URL重写、条件重写以及多级目录重写。

在实际应用中,URL重写可以用于旧URL的迁移、SEO优化、简化URL结构等场景。希望本文的内容能帮助你在实际项目中更好地应用Nginx的URL重写功能。

附加资源

练习

  1. 尝试将https://example.com/blog/2023/09/30重写为https://example.com/post?year=2023&month=09&day=30
  2. 尝试根据请求的Referer头来重写URL,例如将来自https://example.org的请求重定向到https://example.com/welcome

通过练习,你可以进一步巩固对Nginx URL重写功能的理解和应用。