Nginx If - arosh/arosh.github.com GitHub Wiki

Nginx ใฎ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใฏๆ‰‹็ถšใๅž‹่จ€่ชžใฎใ‚ˆใ†ใซไธŠใ‹ใ‚‰ไธ‹ใซ่งฃ้‡ˆใ•ใ‚Œใ‚‹ใ‚ใ‘ใงใฏใชใ„ใ€‚ใปใจใ‚“ใฉใฎ่จญๅฎš้ …็›ฎใซใคใ„ใฆใฏๆ„่ญ˜ใ—ใชใใฆใ‚‚ๅ•้กŒใชใ„ใฎใ ใŒใ€if ใฏ้ž็›ดๆ„Ÿ็š„ใชๆŒ™ๅ‹•ใ‚’ใ—ใŒใกใงใ‚ใ‚‹ใ€‚ ไปฅไธ‹ใฎใ‚ˆใ†ใซๅ…ฌๅผใซใ€ŒIf ใฏ้‚ชๆ‚ชใ€ใจใ™ใ‚‰่จ€ใ‚ใ‚Œใฆใ„ใ‚‹ใ€‚

https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

ใใ†ใฏ่จ€ใฃใฆใ‚‚ if ใ‚’ไฝฟใฃใŸ่ค‡้›‘ใชๅˆถๅพกใฏใ—ใฐใ—ใฐๅฟ…่ฆใจใชใฃใฆใ—ใพใ†ใ“ใจใŒใ‚ใ‚‹ใ€‚ใ“ใ“ใงใฏ้ž็›ดๆ„Ÿ็š„ใชๆŒ™ๅ‹•ใ‚’่งฃ้‡ˆๅฏ่ƒฝใซใ™ใ‚‹ใŸใ‚ใฎๆœ€ๅฐ้™ใฎ็Ÿฅ่ญ˜ใจใ€ใชใ‚‹ในใๅฎ‰ๅ…จใช if ใฎๅ–ใ‚Šๆ‰ฑใ„ๆ–นๆณ•ใซใคใ„ใฆ่ฟฐในใ‚‹ใ€‚

ๆŒ™ๅ‹•ใ‚’่งฃ้‡ˆใ™ใ‚‹ใŸใ‚ใฎ็Ÿฅ่ญ˜

ngx_http_rewrite_module ใซๅซใพใ‚Œใ‚‹ใ‚‚ใฎใจ if ใฎ็ต„ใฟๅˆใ‚ใ›ใฏใ ใ„ใŸใ„ๆœŸๅพ…้€šใ‚Šใซๅ‹•ใ

if ใฏ ngx_http_rewrite_module ใซๅซใพใ‚Œใ‚‹ๆฉŸ่ƒฝใงใ‚ใ‚‹ใ€‚if ไปฅๅค–ใซๅซใพใ‚Œใ‚‹ๆฉŸ่ƒฝใงใ‚ใ‚‹ set, return, rewrite ใชใฉใ‚’ if ใฎไธญใซๆ›ธใ„ใŸๅ ดๅˆใฏใ ใ„ใŸใ„ๆœŸๅพ…้€šใ‚Šใซๅ‹•ใใ€‚

ใŸใจใˆใฐไปฅไธ‹ใฎไพ‹ใ‚’่€ƒใˆใ‚ˆใ†ใ€‚

location /proxy {
    set $a 32;
    if ($a = 32) {
        set $a 56;
    }
    set $a 76;
    proxy_pass http://127.0.0.1:$server_port/$a;
}

How nginx "location if" works ใ‚ˆใ‚Š

Nginx ใฎ่จญๅฎšใŒไธŠใ‹ใ‚‰้ †ใซ่งฃ้‡ˆใ•ใ‚Œใ‚‹ใ‚ใ‘ใงใฏใชใ„ใจ็Ÿฅใฃใฆใ„ใ‚‹ใจ่บซๆง‹ใˆใฆใ—ใพใ†ใŒใ€if ใจ็ต„ใฟๅˆใ‚ใ›ใฆไฝฟใ‚ใ‚Œใฆใ„ใ‚‹ set ใฏ ngx_http_rewrite_module ใฎไปฒ้–“ใงใ‚ใ‚Šใ€ใพใ‚‹ใงไธŠใ‹ใ‚‰้ †ใซ่งฃ้‡ˆใ•ใ‚Œใฆใ„ใ‚‹ใ‹ใฎใ‚ˆใ†ใซ http://127.0.0.1:$server_port/76 ใซ proxy ใ•ใ‚Œใ‚‹ใ€‚

ใ—ใ‹ใ—ใชใŒใ‚‰ If Is Evil ใงใฏ if ใฎไธญใซๅค‰ใชใ‚‚ใฎใ‚’ๆ›ธใ„ใฆใ„ใชใใฆใ‚‚ proxy_pass ใ‚„ try_files ใŒๅ‹•ใ‹ใชใใชใ‚‹ไพ‹ใŒ็ดนไป‹ใ•ใ‚ŒใฆใŠใ‚Šใ€ๆฒนๆ–ญใฏใงใใชใ„ใ€‚

if ใŒ่งฃ้‡ˆใ•ใ‚Œใ‚‹ใ‚ฟใ‚คใƒŸใƒณใ‚ฐใฏ็ตๆง‹ๆ—ฉใ„

Nginx ใฎ่จญๅฎšใฏไธŠใ‹ใ‚‰้ †ใซ่งฃ้‡ˆใ•ใ‚Œใ‚‹ใ‚ใ‘ใงใฏใชใใ€ใƒขใ‚ธใƒฅใƒผใƒซใ”ใจใซๆฑบใ‚ใ‚‰ใ‚ŒใŸๅ„ชๅ…ˆ้ †ไฝใฎ้ †็•ชใง่งฃ้‡ˆใ•ใ‚Œใ‚‹ใ€‚ใใ—ใฆ ngx_http_rewrite_module ใฎๅ„ชๅ…ˆ้ †ไฝใฏ็ตๆง‹ๆ—ฉใ„ใ€‚

ใŸใจใˆใฐไปฅไธ‹ใฎไพ‹ใ‚’่€ƒใˆใ‚ˆใ†ใ€‚

location /proxy {
    set $a 32;
    if ($a = 32) {
        set $a 56;
        echo "a = $a";
    }
    set $a 76;
    proxy_pass http://127.0.0.1:$server_port/$a;
}

How nginx "location if" works ใ‚ˆใ‚Š

echo ใงๅ‡บๅŠ›ใ•ใ‚Œใ‚‹ๅ€คใฏ 56 ใงใฏใชใ 76 ใงใ‚ใ‚‹ใ€‚ใ“ใ‚Œใฏ echo_nginx_module ใ‚ˆใ‚Šใ‚‚ ngx_http_rewrite_module ใฎใปใ†ใŒๅ„ชๅ…ˆ้ †ไฝใŒ้ซ˜ใ„ใŸใ‚ใงใ‚ใ‚‹ใ€‚ใพใš set $a 32, set $a 56 ใŒๅฎŸ่กŒใ•ใ‚ŒใŸใ‚ใจใ€echo "a = $a" ใฏๅพŒๅ›žใ—ใซใ•ใ‚Œใฆ set $a 76 ใŒๅฎŸ่กŒใ•ใ‚Œใ‚‹ใ€‚echo "a = $a" ใŒๅฎŸ่กŒใ•ใ‚Œใ‚‹ใฎใฏใใฎใ‚ใจใงใ‚ใ‚‹ใŸใ‚ใ€็ตๆžœ็š„ใซ $a ใซใฏ 76 ใŒๅ…ฅใฃใฆใ„ใ‚‹ใ€‚

้ŽๅŽปใซใ‚„ใ‚‰ใ‹ใ—ใŸๅฎŸไพ‹ใจใ—ใฆใฏไปฅไธ‹ใฎใ‚‚ใฎใŒใ‚ใ‚‹ใ€‚

location ... {
  auth_basic $host;
  auth_basic_user_file $document_root/.htpasswd;
  if (...) {
    return 301 ...;
  }
}

if ๆ–‡ใฎๆกไปถใŒๆบ€ใŸใ•ใ‚Œใฆใ„ใŸๅ ดๅˆใ‚’่€ƒใˆใ‚ˆใ†ใ€‚ไธŠใ‹ใ‚‰้ †ใซ่งฃ้‡ˆใ•ใ‚Œใ‚‹ใจ่€ƒใˆใŸๅ ดๅˆใ€ใพใš Basic ่ช่จผใŒ่กŒใ‚ใ‚Œใฆใ€ใใ‚Œใ‹ใ‚‰ if ๆ–‡ใฎไธญใฎใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆใŒ่งฃๆฑบใ•ใ‚Œใ‚‹ใจๆ€ใ†ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ€‚ใ—ใ‹ใ—ใชใŒใ‚‰ๅฎŸ้š›ใซใฏ Basic ่ช่จผใชใ—ใงใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆใŒ่งฃๆฑบใ•ใ‚Œใ‚‹ใ€‚ใ“ใ‚Œใฏ ngx_http_auth_basic_module ใ‚ˆใ‚Šใ‚‚ ngx_http_rewrite_module ใฎใปใ†ใŒๅ„ชๅ…ˆ้ †ไฝใŒ้ซ˜ใ„ใŸใ‚ใงใ‚ใ‚‹ใ€‚

if ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ไฝœใ‚‹

Nginx ใฎ่จญๅฎšใซใฏใ€ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซ "if and only if there are no" ใจใ„ใ†่จ˜่ผ‰ใฎใ‚ใ‚‹่จญๅฎš้ …็›ฎใŒๅคšๆ•ฐๅญ˜ๅœจใ™ใ‚‹ใ€‚

Nginx ใฉใƒใƒžใ‚Šใฉใ“ใ‚ N ้ธ

ใ“ใ‚ŒใฏไธŠไฝใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใงใฎ่จญๅฎšใซๅŠ ใˆใฆไธ‹ไฝใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใง่จญๅฎšใ‚’่ฟฝๅŠ ใ—ใ‚ˆใ†ใจใ™ใ‚‹ใจไธŠไฝใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใงใฎ่จญๅฎšใŒ็„กใ‹ใฃใŸใ“ใจใซใ•ใ‚Œใ‚‹ใจใ„ใ†ใ‚‚ใฎใงใ‚ใ‚‹ใ€‚ไธŠ่จ˜ใฎไพ‹ใงใฏไธŠไฝใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ– (http) ใง่จญๅฎšใ—ใŸ proxy_set_header ใŒ็„กใ‹ใฃใŸใ“ใจใซใ•ใ‚Œใฆใ—ใพใฃใฆใ„ใ‚‹ใ€‚

if ใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒ†ใ‚ฃใƒ–ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ไฝœใ‚‹ใจใ„ใ†ใ“ใจใ‚’็Ÿฅใฃใฆใ„ใ‚Œใฐไปฅไธ‹ใฎไพ‹ใง add_header ใŒไธกๆ–นใจใ‚‚ๅฎŸ่กŒใ•ใ‚Œใชใ„ใ“ใจใซใคใ„ใฆ็ดๅพ—ใงใใ‚‹ใ‚ˆใ†ใซใชใ‚‹ใ ใ‚ใ†ใ€‚

location /only-one-if {
    set $true 1;

    if ($true) {
        add_header X-First 1;
    }

    if ($true) {
        add_header X-Second 2;
    }

    return 204;
}

If Is Evil ใ‚ˆใ‚Š

ๅ‚่€ƒ่ณ‡ๆ–™