在 Nginx 的众多功能中,rewrite 指令尤为突出,它是进行 URL 重定向和重写的核心工具,可以实现在不改变原始请求的情况下修改目标 URL,从而提供更灵活的 URL 管理方式,增强网站的 SEO 友好性和功能性。
什么是 rewrite?
rewrite 指令允许你根据特定规则修改请求的 URI(Uniform Resource Identifier)。它可以匹配 URL 的部分或全部,执行重定向或者内部重写操作,从而影响请求的流向和最终被处理的资源。
基本语法
rewrite 指令的基本语法如下:
rewrite [flag] pattern replacement [flag];
其中,
pattern是正则表达式,用于匹配请求的 URI;replacement是替换字符串,可以包含变量,用于构造新的 URI;[flags]是一系列可选标志位,如last,break,redirect,permanent等,用于指示行为细节。
标志位解释
last: 执行完当前规则后,停止后续的rewrite规则检测,直接处理当前规则的结果。break: 类似last,但只在当前if块内有效。redirect: 返回 302 临时重定向给客户端。permanent: 返回 301 永久重定向给客户端。
示例说明
- 简单的重定向
如果你想将所有旧的 URL
http://oldsite.com/path/*重定向至https://newsite.com/newpath/*:location / { rewrite ^/oldsite/(.*) https://newsite.com/newpath/$1 permanent; } - 内部重写
如果需要将请求
/product/123重写为/products/view?pid=123:location / { rewrite ^/product/([0-9]+)$ /products/view?pid=$1 last; }注意
$1表示捕获第一个括号内的数字。 - 条件判断
只有当 URL 匹配某条件时才重写:
if ($host = oldsite.com) { rewrite ^/(.*) https://www.newsite.com/$1 permanent; }
复杂使用
rewrite 指令还可以嵌套使用,例如:
location / {
rewrite ^(/images|/css|/js)/(.*) $1$2 break;
rewrite ^/images/ (.*\.jpg|.*\.png|.*\.gif)$ /images/$1 last;
}
这里先检查是否请求了 /images, /css, 或 /js,如果是,则继续进行更精确的匹配和重写。
总结
rewrite 指令是 Nginx 中极其强大的工具,掌握了它的使用方法,可以极大增强网站的灵活性和功能性,帮助优化 SEO 和用户体验。但是,不当的配置可能导致性能下降,所以建议谨慎使用,避免过度复杂的规则链。