如何从 nginx 配置中的 $uri 中删除位置块?

如何从 nginx 配置中的 $uri 中删除位置块?

我的 ngix conf 文件中有一个重写,它工作正常,只是它似乎将位置块作为 $uri 变量的一部分包含在内。我只想要位置块后的路径。我当前的配置代码是:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

使用重定向的示例 URLhttp://localhost/cargo/testpage有效,但我的 php 文件收到的“_REWRITE_COMMAND”参数的值为“/cargo/testpage”。我需要删除位置块,只将“testpage”作为 $uri

我很确定存在一个正则表达式语法来拆分 $uri 并使用 $1 $2 等将其分配给新变量,但我找不到任何使用不属于重写语句的正则表达式进行变量赋值的示例。我已经寻找并尝试了几个小时,但似乎就是无法完成最后一步。

我也知道我可以从应用程序代码中删除它,但我想尝试在 nginx conf 中修复它的原因是为了兼容性,因为它也在 Apache 上运行。我还应该说,我已经找到了一种非常 hack 的方法来做到这一点,但它涉及一个“if”语句来检查文件是否存在,文档明确指出不是用那種方式去做。

答案1

环顾四周,我猜想使用带有捕获的正则表达式位置是最简单的。调整您的示例,我最终得到:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

答案2

我发现了另一件对我有用的东西(因为我正在使用 gunicorn,所以我无法选择要传递什么)

你应该能够逃脱

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

答案3

对于那些可能难以使用 Node JS 将其添加到微服务或 API 的人,我使用以下命令api从我的服务器上的 URL 中删除:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }

相关内容