Nginx 我怎样才能把它合并成一个区块?
如果path=“/”和查询变量“band”!="". 我已经能够理解下面的各个部分(我想),但我想知道是否有更简单的方法。看起来这一切都可能在一张地图上:Nginx 我怎样才能把它合并成一个区块?,nginx,Nginx,如果path=“/”和查询变量“band”!="". 我已经能够理解下面的各个部分(我想),但我想知道是否有更简单的方法。看起来这一切都可能在一张地图上: map $request_uri $myvar { ~(?<captured_path>[^?]*) $captured_path; } map $arg_band $band{ "" 0; default 1; } map "$myvar:$band" $qualifies{ default 0; "
map $request_uri $myvar {
~(?<captured_path>[^?]*) $captured_path;
}
map $arg_band $band{
"" 0;
default 1;
}
map "$myvar:$band" $qualifies{
default 0;
"/:1" 1;
}
map$request\u uri$myvar{
~(?[^?]*)$捕获的路径;
}
映射$arg_band$band{
"" 0;
违约1;
}
映射“$myvar:$band”$符合条件{
默认为0;
"/:1" 1;
}
因为丑陋而想这样做,并且知道可能有更好的方法。Abstract
因此,如果$uri
都是/
并且$arg\u band
没有设置为任何值,那么您试图将$qualifies
设置为1
基本思想
与您自己的代码相比的基本思想是,我们必须对逻辑和操作进行反向操作,以使逻辑或-(a和b)
始终与相同!(!a | |!b)
-一旦你了解了理论,那么剩下的就是一点编码
事实上,用一个简单的
讨论
如果您不喜欢处理$arg_band
的双案例,您可以使用的lookback运算符,但是,我相信上述两个案例实际上可能比下面的单个案例更有效、更正确:
^[^?]+[?].*(?<=[?&])band=[^&] # incorrect! will match /??band=a
总结
制定总体解决方案:
map $request_uri $qualifies {
default 1;
~^[^?]+[?](.*&)?band=[^&] 0;
~^[/]+[^/?]+ 0;
}
但是,你也必须考虑你的解决方案必须绝对正确,如果需要非常高的正确度,那么对你自己的<代码> $Restestuuri < /代码>进行分析可能是不合适的。(例如,当
$request\u uri
为/a/././
时,$uri
将由于URL规范化而成为/
,并且您的原始解决方案已经受到了此影响)。摘要
因此,如果$uri
都是/
并且$arg\u band
没有设置为任何值,那么您试图将$qualifies
设置为1
基本思想
与您自己的代码相比,基本思想是,我们必须将逻辑和操作与逻辑或-(a&&b)
始终与相同!(!a | | b)
——一旦您了解了理论,那么剩下的就是一点编码
事实上,用一个简单的
讨论
如果您不喜欢处理$arg_band
的双案例,您可以使用的lookback运算符,但是,我相信上述两个案例实际上可能比下面的单个案例更有效、更正确:
^[^?]+[?].*(?<=[?&])band=[^&] # incorrect! will match /??band=a
总结
制定总体解决方案:
map $request_uri $qualifies {
default 1;
~^[^?]+[?](.*&)?band=[^&] 0;
~^[/]+[^/?]+ 0;
}
但是,你也必须考虑你的解决方案必须绝对正确,如果需要非常高的正确度,那么对你自己的<代码> $Restestuuri < /代码>进行分析可能是不合适的。(例如,当
$request\u uri
为/a/./
时,由于URL规范化,$uri
将仅为/
,而您的原始解决方案已经受到此影响).我们似乎没有意识到,$uri
中已经存在无查询URL,因此,另一种可能的解决方案如下所示:
map $uri:$arg_band $qualified {
default 0;
~^/:[^:]+$ 1;
}
注意$uri
和$arg\u band
都可以包含“怪异”字符(例如,都可以包含?
,),因此,您必须确保在正则表达式中匹配实际的分隔符,而不是用户提供的占位符。这可以通过将其设置为随机、长且保密,或者通过限制用户可接受的输入来实现
请注意,在不知道使用了什么其他逻辑以及如何使用变量的情况下,大多数显而易见的、好看的解决方案实际上都会包含潜在的安全漏洞,并且是不正确的(例如,如果
$arg_band
确实包含:
,则上述解决方案可能是不正确的).我们似乎没有意识到,$uri
中已经存在无查询URL,因此,另一种可能的解决方案如下所示:
map $uri:$arg_band $qualified {
default 0;
~^/:[^:]+$ 1;
}
注意$uri
和$arg\u band
都可以包含“怪异”字符(例如,都可以包含?
,),因此,您必须确保在正则表达式中匹配实际的分隔符,而不是用户提供的占位符。这可以通过将其设置为随机、长且保密,或者通过限制用户可接受的输入来实现
请注意,在不知道使用了什么其他逻辑以及如何使用变量的情况下,大多数显而易见的、好看的解决方案实际上都会包含潜在的安全漏洞,并且是不正确的(例如,如果
$arg_band
确实包含:
,则上述解决方案可能是不正确的).如果答案满足问题,请您投票/接受好吗?不要奖励,因为这会使问题无法在特色页面上引起注意如果答案满足问题,请您投票/接受好吗?不要奖励,因为这会使问题无法在特色页面上引起注意“$如果$uri和$arg_band都设置为/并且$arg_band都未设置为任何值,$则限定为1”。.s/b“$如果$uri和$arg_band都设置为/并且$arg_band都未设置为任何值,$则限定为1”。.s/b”$如果$uri和$arg_band都设置为某个值,则限定为1”