Regex 如何使Nginx重写懒惰(非贪婪)
我对Nginx进行了如下重写:Regex 如何使Nginx重写懒惰(非贪婪),regex,nginx,url-rewriting,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 我怎样才能让它从一开始就捕捉,而
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…在所有不同的位置)如果您知道URI只包含两个前导路径元素,请使用不包含
/
字符的字符类(例如[^/]
)
例如:
^/[^/]+/[^/]+/((?:css|img|includes|js|vendor|template)/.+)?$
^/.+?/.+?/((?:css|img|includes|js|vendor|template)/.+)?$
但是,如果您有两个或多个前导路径元素,并且需要使它们非贪婪,请使用+?
运算符代替+
运算符
例如:
^/[^/]+/[^/]+/((?:css|img|includes|js|vendor|template)/.+)?$
^/.+?/.+?/((?:css|img|includes|js|vendor|template)/.+)?$
或者甚至是上述各项的混合:
^/[^/]+/.+?/((?:css|img|includes|js|vendor|template)/.+)?$
使用指令
rewrite ^/[^/]+/[^/]+/(css|img|includes|js|vendor|template)(/.+|)$ /$1$2 last;
注意:
[^/]
匹配任何字符,但/
尝试^.+(((?:vendor | css | img | includes | js | template)\/.+)?$
我尝试了Richard的解决方案,解决了我的问题。。。所以我没有测试你的。。。无论如何,谢谢你,第一个和第二个解决方案都有效。我没有试过第三个,因为我相信它也会起作用。我也完全理解你在那里所做的一切,所以似乎有一些关于regex的事情我还不知道。。。谢谢!!