Nginx地址重写与重定向


rewrite与return

在 Nginx 中,rewrite 和重定向都是用于改变 URL 的机制,但它们的工作方式和应用场景有所不同。以下是它们的详细解释和区别:

1. rewrite重写

rewrite 是在服务器内部改变 URL,客户端不会察觉到 URL 的变化。rewrite 通常用于将一个 URL 模式匹配到另一个 URL 模式,而不改变浏览器中的 URL。

语法:

rewrite 正则表达式 替换目标 [标志];

示例:

location /oldpage {
    rewrite ^/oldpage/(.*)$ /newpage/$1 last;
}

在这个例子中,当请求 /oldpage/something 时,Nginx 会将其内部重写为 /newpage/something,但浏览器中的 URL 不会改变。

常用标志:

  • last:停止处理当前的 location 块,并使用重写后的 URI 重新搜索新的 location 匹配。
  • break:停止处理当前的 location 块,并且不再进行任何重写或重定向。
  • redirect:返回一个临时的重定向给客户端。
  • permanent:返回一个永久重定向给客户端。

2. return重定向

重定向是让客户端浏览器实际改变 URL。Nginx 返回一个 HTTP 状态码(通常是 301 永久重定向或 302 临时重定向),告诉客户端浏览器去请求一个新的 URL。

示例:

location /oldpage {
    return 301 /newpage;
}

在这个例子中,当请求 /oldpage 时,Nginx 会返回一个 301 永久重定向状态码,告诉客户端浏览器去请求 /newpage。浏览器中的 URL 会改变为 /newpage

重写与重定向的区别

  1. URL 是否改变

    • rewrite 重写:URL 不会在客户端浏览器中改变。
    • return 重定向:URL 会在客户端浏览器中改变。
  2. HTTP 状态码

    • rewrite 重写:不涉及 HTTP 状态码。
    • return 重定向:返回 301 或 302 状态码。
  3. 应用场景

    • rewrite 重写:常用于内部 URL 重写,比如将动态 URL 重写为静态 URL,或者将复杂的 URL 结构简化。
    • return 重定向:常用于永久或临时改变 URL,比如网站改版后将旧 URL 重定向到新 URL。

综合示例

server {
    listen 80;
    server_name example.com;

    location /oldpage {
        # 内部重写
        rewrite ^/oldpage/(.*)$ /newpage/$1 last;
    }

    location /movedpage {
        # 临时重定向
        return 302 /newpage;
    }

    location /permanentlymovedpage {
        # 永久重定向
        return 301 /newpage;
    }
}

在这个示例中:

  • 请求 /oldpage/something 会被重写为 /newpage/something,但浏览器中的 URL 不会改变。
  • 请求 /movedpage 会被临时重定向到 /newpage,浏览器中的 URL 会改变,并且状态码是 302。
  • 请求 /permanentlymovedpage 会被永久重定向到 /newpage,浏览器中的 URL 会改变,并且状态码是 301。

总结

  • 使用 rewrite 进行内部 URL 重写,客户端不会察觉到 URL 的变化。
  • 使用 return 进行重定向,客户端会察觉到 URL 的变化,并且会收到一个 HTTP 状态码。

根据具体需求选择合适的机制,可以有效地管理和优化你的网站 URL 结构。