Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx 我怎样才能把它合并成一个区块?_Nginx - Fatal编程技术网

Nginx 我怎样才能把它合并成一个区块?

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; "

如果path=“/”和查询变量“band”!="". 我已经能够理解下面的各个部分(我想),但我想知道是否有更简单的方法。看起来这一切都可能在一张地图上:

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”