插件窝 干货文章 nginx的url重写怎么用

nginx的url重写怎么用

rewrite 重写 Nginx 定向 306    来源:    2025-04-23

Nginx URL重写指南

URL重写是Nginx中一个强大的功能,允许你修改客户端请求的URL。下面详细介绍如何使用Nginx的URL重写功能。

基本语法

URL重写主要通过rewrite指令实现:

rewrite regex replacement [flag];
  • regex:正则表达式,匹配原始URL
  • replacement:替换字符串
  • flag:可选标志,控制重写行为

常用标志(flag)

  • last:停止处理当前重写规则,用新URL重新匹配location
  • break:停止处理当前重写规则,继续处理其他指令
  • redirect:返回302临时重定向
  • permanent:返回301永久重定向

常见使用场景

1. 基本重定向

rewrite ^/oldpath$ /newpath permanent;

2. 捕获组使用

rewrite ^/user/(.*)$ /profile.php?user=$1 last;

3. 去除.php扩展名

rewrite ^/([^/]+)/?$ /$1.php last;

4. 强制HTTPS

rewrite ^ https://$host$request_uri? permanent;

5. 统一域名

if ($host != "www.example.com") {
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

最佳实践

  1. location中使用:通常将rewrite规则放在location块中
location /blog/ {
    rewrite ^/blog/(.*)$ /news/$1 permanent;
}
  1. 避免过多重定向:过多的重定向会影响性能

  2. 测试正则表达式:使用在线工具测试你的正则表达式

  3. 考虑性能:复杂的正则表达式可能影响性能

  4. 使用try_files:对于静态文件,try_files通常比rewrite更高效

完整示例

server {
    listen 80;
    server_name example.com;

    # 重定向非www到www
    if ($host = 'example.com') {
        rewrite ^/(.*)$ http://www.example.com/$1 permanent;
    }

    # 去除.php扩展名
    location / {
        try_files $uri $uri/ @extensionless-php;
    }

    location @extensionless-php {
        rewrite ^(.*)$ $1.php last;
    }

    # 旧URL重定向
    location /old/ {
        rewrite ^/old/(.*)$ /new/$1 permanent;
    }

    # 强制HTTPS
    if ($scheme = http) {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

调试技巧

  1. 使用rewrite_log on;开启重写日志
  2. 检查Nginx错误日志
  3. 使用curl -v测试重定向行为

希望这个指南能帮助你掌握Nginx的URL重写功能!