编程 Nginx rewrite 的用法

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

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

推荐文章

php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
一个简单的html卡片元素代码
2024-11-18 18:14:27 +0800 CST
html夫妻约定
2024-11-19 01:24:21 +0800 CST
宝塔面板 Nginx 服务管理命令
2024-11-18 17:26:26 +0800 CST
Go 1.23 中的新包:unique
2024-11-18 12:32:57 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
Vue3中的Slots有哪些变化?
2024-11-18 16:34:49 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
PHP 唯一卡号生成
2024-11-18 21:24:12 +0800 CST
jQuery中向DOM添加元素的多种方法
2024-11-18 23:19:46 +0800 CST
Vue3中的虚拟滚动有哪些改进?
2024-11-18 23:58:18 +0800 CST
Requests库详细介绍
2024-11-18 05:53:37 +0800 CST
如何在Vue3中处理全局状态管理?
2024-11-18 19:25:59 +0800 CST
程序员茄子在线接单