编程 Nginx rewrite 的用法

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

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管理

推荐文章

Go 并发利器 WaitGroup
2024-11-19 02:51:18 +0800 CST
PHP 代码功能与使用说明
2024-11-18 23:08:44 +0800 CST
CSS Grid 和 Flexbox 的主要区别
2024-11-18 23:09:50 +0800 CST
Python中何时应该使用异常处理
2024-11-19 01:16:28 +0800 CST
Roop是一款免费开源的AI换脸工具
2024-11-19 08:31:01 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
PHP中获取某个月份的天数
2024-11-18 11:28:47 +0800 CST
Rust 与 sqlx:数据库迁移实战指南
2024-11-19 02:38:49 +0800 CST
php腾讯云发送短信
2024-11-18 13:50:11 +0800 CST
PHP 压缩包脚本功能说明
2024-11-19 03:35:29 +0800 CST
mysql关于在使用中的解决方法
2024-11-18 10:18:16 +0800 CST
Web浏览器的定时器问题思考
2024-11-18 22:19:55 +0800 CST
HTML + CSS 实现微信钱包界面
2024-11-18 14:59:25 +0800 CST
robots.txt 的写法及用法
2024-11-19 01:44:21 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
Vue中的样式绑定是如何实现的?
2024-11-18 10:52:14 +0800 CST
Go中使用依赖注入的实用技巧
2024-11-19 00:24:20 +0800 CST
什么是Vue实例(Vue Instance)?
2024-11-19 06:04:20 +0800 CST
java MySQL如何获取唯一订单编号?
2024-11-18 18:51:44 +0800 CST
Python实现Zip文件的暴力破解
2024-11-19 03:48:35 +0800 CST
Go 语言实现 API 限流的最佳实践
2024-11-19 01:51:21 +0800 CST
CSS 媒体查询
2024-11-18 13:42:46 +0800 CST
程序员茄子在线接单