如何通过取第一段重写随机生成的 nginx 路径?

How to rewrite randomly generated nginx path by taking the first segment?

我有一个 prestashop 实例,它生成随机 URL 供管理员访问。唯一的规则是路径以 "admin".

开头

以下规则工作正常,但它是手动硬编码的:

location /admin6908ewwh6/ {
    if (!-e $request_filename) {
        rewrite ^/.*$ /admin6908ewwh6/index.php last;
    }
}

我试着改写成这样:

location ^(/admin.*?)(\w+)/ {
    if (!-e $request_filename) {
        rewrite ^/.*$ /index.php last;
    }
}

但这不起作用,我不知道为什么因为根据这个正则表达式匹配器 (https://www.regextester.com/102896),当我将 ^(/admin.*?)(\w+) 正则表达式与测试字符串 /admin6908ewwh6/index.php/sell/catalog/products/new?_token=_JC1fQPwgvwnhZTWyeGVTy4nET350GC4Aro888TuzDA&它只是抓住了我需要拿走的东西。

谁能解释一下为什么这两个位置块不等价?

问题是</code>。数字捕获由最后一个要评估的正则表达式分配,在本例中是 <code>rewrite 语句(尽管正则表达式中没有括号)。

一种解决方案是在rewrite语句中进行捕获,例如:

location /admin {
    if (!-e $request_filename) {
        rewrite ^(/admin[^/]+)/ /index.php last;
    }
}

或者没有 if 块:

location /admin {
    try_files $uri $uri/ @admin;
}
location @admin {
    rewrite ^(/admin[^/]+)/ /index.php last;
}

或没有 rewrite 语句:

location ~ ^(/admin[^/]+)/ {
    try_files $uri $uri/ /index.php$is_args$args;
}

确保最后一个位置块位于处理 .php URI 的块下方。