如何使Nginx重写懒惰(非贪婪)

时间:2018-06-27 10:36:10

标签: regex nginx url-rewriting

我对Nginx进行了这样的重写:

rewrite ^\/.+\/.+\/((?:css|img|includes|js|vendor|template)\/.+)?$ /$1 last;

以下网址:

foo/bar/vendor/datetimepicker/css/datetimepicker.css

被重定向到

css/datetimepicker.css

代替

vendor/datetimepicker/css/datetimepicker.css

如何使它从头开始捕获而不是从最后一部分捕获?

我发现解决方案可能是使表达式不贪心,但是我尝试的所有方法都失败了(添加了?,在所有不同位置添加了/ U ...

2 个答案:

答案 0 :(得分:2)

如果您知道URI仅包含两个前导路径元素,请使用排除/字符的字符类(例如[^/])。

例如:

^/[^/]+/[^/]+/((?:css|img|includes|js|vendor|template)/.+)?$

但是,如果您有两个或多个前导路径元素,并且需要使其不贪心,请使用+?运算符代替+运算符。

例如:

^/.+?/.+?/((?:css|img|includes|js|vendor|template)/.+)?$

甚至是上述各项的混合:

^/[^/]+/.+?/((?:css|img|includes|js|vendor|template)/.+)?$

答案 1 :(得分:0)

使用指令

rewrite ^/[^/]+/[^/]+/(css|img|includes|js|vendor|template)(/.+|)$ /$1$2 last;

注意:[^/]匹配除/以外的任何字符