如何通过取第一段重写随机生成的 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 的块下方。
我有一个 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 的块下方。