插件窝 干货文章 如何使用Nginx进行请求重定向和URL重写

如何使用Nginx进行请求重定向和URL重写

重写 定向 rewrite Nginx 818    来源:    2025-04-13

Nginx请求重定向与URL重写指南

Nginx提供了强大的重定向和URL重写功能,主要通过rewrite指令和return指令实现。以下是详细的使用方法:

1. 基本重定向

使用return指令

# 301永久重定向
server {
    listen 80;
    server_name olddomain.com;
    return 301 http://newdomain.com$request_uri;
}

# 302临时重定向
server {
    listen 80;
    server_name temp.example.com;
    return 302 http://example.com/temporary;
}

使用rewrite指令

# 重定向特定路径
location /oldpath {
    rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
}

2. URL重写

基本重写

# 重写URL但不重定向(客户端URL不变)
location /products {
    rewrite ^/products/(.*)$ /items/$1 last;
}

带条件的重写

# 如果文件不存在则重写
location /images {
    try_files $uri @rewrite;
}

location @rewrite {
    rewrite ^/images/(.*)$ /static/images/$1 last;
}

3. 常见应用场景

强制HTTPS

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

统一域名(带/不带www)

server {
    listen 80;
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

美化URL(隐藏.php扩展名)

location / {
    try_files $uri $uri/ $uri.php?$args;
}

location ~ \.php$ {
    # PHP处理配置
}

重写查询字符串

rewrite ^/search/(.*)$ /search.php?q=$1? last;

4. 高级技巧

正则表达式捕获

rewrite ^/user/([0-9]+)/profile$ /profile.php?id=$1 last;

多条件重写

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

保留原始查询参数

rewrite ^/path/(.*)$ /newpath/$1?$args last;

5. 调试技巧

  1. 使用rewrite_log on;开启重写日志(需要设置error_log级别为notice)
  2. 测试配置语法: nginx -t
  3. 逐步测试重写规则

注意事项

  1. 尽量使用return进行简单重定向,性能更好
  2. 避免过多if条件判断,可能影响性能
  3. 301重定向会被浏览器缓存,开发时慎用
  4. 复杂的重写规则应考虑使用map指令

通过合理使用这些重定向和重写技术,您可以实现URL规范化、路由美化、旧链接迁移等多种需求。