当前位置:   article > 正文

Nginx 实战:Nginx Rewrite重写

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;
}
  • 1
  • 2
  • 3

在这个例子中,正则表达式 ^/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服务的其他配置
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这个例子中,我们没有直接使用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或者其他后端服务器的配置
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

注意事项:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/311473
推荐阅读
相关标签
  

闽ICP备14008679号