Nginx 实战:Nginx Rewrite重写

Nginx的rewrite指令提供了非常灵活的方式来重写或重定向客户端的请求URI。以下是一些基本的实战例子来说明如何在Nginx中配置rewrite规则:

示例1:从查询字符串参数转换为路径参数

原始情况
用户请求 http://www.example.com/index.php?id=123

期望转换
转换为 http://www.example.com/article/123

location / {
    rewrite ^/index.php?id=(\d+)$ /article/$1 permanent;
}

在这个例子中,正则表达式 ^/index.php?id=(\d+)$ 匹配以 /index.php?id= 开始且后面跟着数字的请求,并捕获这个数字。$1 在重写目标中引用了捕获的数字,然后使用 permanent 参数发起一个301永久重定向。

示例2:从HTTP重定向到HTTPS

原始情况
用户通过HTTP请求 http://www.example.com

期望转换
强制重定向到HTTPS版本 https://www.example.com

server {
    listen 80;
    server_name www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name www.example.com;

    # SSL 配置部分省略...

    location / {
        # 此处是HTTPS服务的其他配置
    }
}

在这个例子中,我们没有直接使用rewrite,而是使用return指令发送一个301重定向响应给客户端,强制其使用HTTPS。

示例3:内部重写(不改变浏览器地址栏)

原始情况
用户请求 http://www.example.com/blog/post1

期望内部处理
实际请求后端的 /app/posts.php?slug=post1 而不改变用户的可见URL

location /blog/ {
    rewrite ^/blog/(post\d+)/$ /app/posts.php?slug=$1 last;
}

location /app/ {
    try_files $uri $uri/ =404;
    # 这里是PHP-FPM或者其他后端服务器的配置
}

这里使用了 last 标志,表示完成当前rewrite循环并继续执行后续的location处理。这样,虽然用户看到的是 /blog/post1,但Nginx会把请求转发给 /app/posts.php,并传递相应的参数。

注意事项:

  • rewrite 规则可以在serverlocationif上下文中使用。
  • 使用break标志停止当前rewrite循环。
  • 使用last标志继续执行新的location查找。
  • 使用permanentredirect发起外部重定向,并返回301或302状态码给客户端。
  • 在复杂重写规则中,确保避免死循环,并合理使用breaklast等标志控制流程。
  • Nginx的rewrite_log可以开启详细重写日志记录,有助于调试规则。

根据实际情况调整这些例子以适应您的具体需求。在编写规则时,务必考虑性能和正则表达式的效率。

  • 24
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值