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


16

我在ngix conf文件中进行了重写,可以正常工作,只是它似乎将位置块包含在$ uri变量中。我只想要位置块后面的路径。我当前的配置代码是:

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

使用http://localhost/cargo/testpage重定向的示例URL 可以,但是我的php文件接收到的“ _REWRITE_COMMAND”参数的值为“ / cargo / testpage”。我需要剥离位置块,然后将“ testpage”作为$ uri

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

我也知道我可以在应用程序代码上删除它,但是我想在nginx conf中修复它的原因是出于兼容性原因,因为它也可以在Apache上运行。我还应该说我已经找到了一种真正的方法,但是它涉及一个“ if”语句来检查文件是否存在,文档特别指出要这样做。

Answers:


18

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

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

啊哈,一旦有人向您指出,就这么简单!我必须进行一些小的修订,以处理将根URL重写到正确位置的情况。我在这个问题中提出了答案,因为我无法在此注释中进行任何格式化。剩下的唯一警告是,php块现在必须在此位置块之上,否则将创建无限重定向循环(由于/ cargo是正则表达式,并且重定向URL也包含/ cargo)。不知道是否还有另一种方法可以防止这种情况发生?
杰森

我建议阅读正则表达式和非正则表达式位置的顺序。我通常会在某个时候使用所有位置的regexp,因为顺序是由配置文件中的顺序决定的,而不是匹配的特异性。
Theuni 2012年

谢谢,我在想使上面的正则表达式更好的是,如果它匹配/ cargo /(除ind​​ex.php以外的任何东西),那么它将防止由于无限重写循环而导致的服务器错误。
杰森

3

我发现了另一件对我有用的东西(由于我使用的是金枪鱼,所以我无法选择通过的内容)

你应该能够摆脱

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

1

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

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.