编程 Nginx rewrite 的用法

2024-11-18 22:59:02 +0800 CST views 1301

Nginx rewrite 的用法

Nginx 的 rewrite 指令非常强大,可以根据请求的 URI 重写路径,进而将请求导向其他 URI 或者返回特定的响应。这对于 URL 重写、伪静态、重定向等场景非常有用。本文将详细介绍 rewrite 指令的语法、使用场景及一些具体案例。

一、Rewrite 指令语法

Nginx 的 rewrite 指令可以在 serverlocationif 上下文中使用,其基本语法如下:

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

四、注意事项

  1. 避免无限循环:不当的 rewrite 规则可能导致循环重定向,因此在编写规则时要格外小心。

  2. 优先使用 try_files 指令:处理静态文件时,try_filesrewrite 更快且更高效。因此在可能的情况下,优先考虑使用 try_files

  3. 慎用 if 指令:Nginx 的 if 指令在某些情况下可能会导致复杂的逻辑问题。Nginx 官方建议尽量使用其他指令(如 rewritetry_files 等)来替代 if

五、总结

Nginx 的 rewrite 指令功能非常强大,适用于多种场景的 URL 重写和重定向。通过合理的配置,你可以让 Nginx 自动处理 URL 的伪静态、重定向以及各种 URL 重写需求。在使用时要注意避免不必要的循环重定向,并尽可能简化规则以提高服务器性能。

常用场景总结

  • URL 重写(例如将动态 URL 变为伪静态)
  • 重定向(例如 HTTP 重定向到 HTTPS)
  • 删除 URL 中的尾斜杠

通过上述配置示例,Nginx 可以实现强大的 URL 重写和重定向功能,提升网站用户体验和 SEO 效果。
images

复制全文 生成海报 Nginx Web服务器 URL管理

推荐文章

Vue3中怎样处理组件引用?
2024-11-18 23:17:15 +0800 CST
全新 Nginx 在线管理平台
2024-11-19 04:18:33 +0800 CST
PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
html折叠登陆表单
2024-11-18 19:51:14 +0800 CST
Vue3中的自定义指令有哪些变化?
2024-11-18 07:48:06 +0800 CST
在Rust项目中使用SQLite数据库
2024-11-19 08:48:00 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
你可能不知道的 18 个前端技巧
2025-06-12 13:15:26 +0800 CST
go错误处理
2024-11-18 18:17:38 +0800 CST
12个非常有用的JavaScript技巧
2024-11-19 05:36:14 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
Gin 框架的中间件 代码压缩
2024-11-19 08:23:48 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
css模拟了MacBook的外观
2024-11-18 14:07:40 +0800 CST
防止 macOS 生成 .DS_Store 文件
2024-11-19 07:39:27 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
php 统一接受回调的方案
2024-11-19 03:21:07 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
程序员茄子在线接单