Nginx rewrite 的用法
Nginx 的 rewrite
指令非常强大,可以根据请求的 URI 重写路径,进而将请求导向其他 URI 或者返回特定的响应。这对于 URL 重写、伪静态、重定向等场景非常有用。本文将详细介绍 rewrite
指令的语法、使用场景及一些具体案例。
一、Rewrite 指令语法
Nginx 的 rewrite
指令可以在 server
、location
或 if
上下文中使用,其基本语法如下:
rewrite regex replacement [flag];
- regex:用于匹配请求 URI 的正则表达式。
- replacement:用于替换匹配到的 URI 的字符串。若字符串以
http://
或https://
开头,表示该请求将被重定向到新的 URI,而不再由 Nginx 继续处理。 - flag:标志位,常用的标志位有:
last
:停止处理后续的rewrite
指令,并开始重新搜索匹配的location
块。break
:停止处理后续的rewrite
指令,但不再重新搜索location
块。redirect
:返回 302 临时重定向。permanent
:返回 301 永久重定向。
二、使用场景
- URL 重写:将复杂的 URL 映射为简洁的 URL。
- 伪静态:将动态 URL 伪装为静态 URL,利于 SEO。
- 重定向:将旧网站的 URL 重定向到新网站的 URL。
三、Nginx rewrite 案例
1. 伪静态案例
假设你的网站使用 PHP 动态生成内容,但你希望 URL 看起来像静态的 HTML 页面。
location / {
rewrite ^/article/(\d+)\.html$ /article.php?id=$1 last;
}
这个规则会将 /article/123.html
重写为 /article.php?id=123
,并重新搜索匹配的 location
块。
2. 永久重定向案例
如果你需要将旧网站的 URL 永久重定向到新网站的 URL,可以使用 permanent
标志位。
server {
listen 80;
server_name oldsite.com;
rewrite ^/(.*)$ http://newsite.com/$1 permanent;
}
这个规则会将所有指向 oldsite.com
的请求永久重定向到 newsite.com
,同时保持原有请求路径不变。
3. 去除 URL 中的尾斜杠
有时候,你希望用户输入的 URL 无论是否带尾斜杠,都能正确处理。
location / {
if (!-d $request_filename) {
rewrite ^/(.+)/$ /$1 last;
}
}
这个规则会检查请求的 URI 是否为一个目录(-d $request_filename
)。如果不是目录,且 URI 末尾有斜杠,则去掉尾斜杠,并重新搜索匹配的 location
块。
4. 将 HTTP 请求重定向为 HTTPS
为了提高安全性,您可能希望所有的 HTTP 请求自动重定向到 HTTPS。
server {
listen 80;
server_name www.example.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
此规则会将所有指向 http://www.example.com
的请求重定向到 https://www.example.com
。
5. 强制 www 重定向
如果你希望所有不带 www
的请求都重定向到带 www
的域名,可以使用如下配置:
server {
listen 80;
server_name example.com;
rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}
这个配置会将 example.com
重定向到 www.example.com
。
四、注意事项
避免无限循环:不当的
rewrite
规则可能导致循环重定向,因此在编写规则时要格外小心。优先使用
try_files
指令:处理静态文件时,try_files
比rewrite
更快且更高效。因此在可能的情况下,优先考虑使用try_files
。慎用
if
指令:Nginx 的if
指令在某些情况下可能会导致复杂的逻辑问题。Nginx 官方建议尽量使用其他指令(如rewrite
、try_files
等)来替代if
。
五、总结
Nginx 的 rewrite
指令功能非常强大,适用于多种场景的 URL 重写和重定向。通过合理的配置,你可以让 Nginx 自动处理 URL 的伪静态、重定向以及各种 URL 重写需求。在使用时要注意避免不必要的循环重定向,并尽可能简化规则以提高服务器性能。
常用场景总结:
- URL 重写(例如将动态 URL 变为伪静态)
- 重定向(例如 HTTP 重定向到 HTTPS)
- 删除 URL 中的尾斜杠
通过上述配置示例,Nginx 可以实现强大的 URL 重写和重定向功能,提升网站用户体验和 SEO 效果。