중첩 된 위치


60

nginx의 중첩 위치를 이해하는 데 문제가 있습니다. 공통적 인 구성 지시문이있는 두 위치가 있으므로 지시문을 반복하는 대신 정규 표현식을 사용하여 URI를 반복하는 것이 좋습니다.

location ~ /a|/b {
        location /a {
        }
        location /b {
        }
}

그러나 이것은 오류를 제공합니다

nginx: [emerg] location "/a" is outside location "/a|/b" in /etc/nginx/nginx.conf:36

|하지만 그렇지 않으면 괜찮아 보입니다.

location ~ /a {
        location /a {
        }
}

내가 무엇을 잘못하고 있지? 아무것도 반복하지 않고 이것을 수행하는 더 좋은 방법이 있습니까? 다른 방법으로 위치를 그룹화 할 수 있습니까?


1
왜 그들을 그룹화합니까? 왜 KISS가 아닌가?
pkhamre


6
논리적으로 그룹화되어 있기 때문에
Jayen

이를 이해하는 데 오랜 시간이 걸렸지 만 결국 에는 위치 선택 방법에 대한 간단한 우선 순위 목록 을 만들 수있었습니다 .
artfulrobot

답변:


101

오래된 질문이지만 문제는 상위 위치가 정규식 위치이고 중첩 위치가 접두사 위치이기 때문에 문제입니다.

부모 위치가 접두사 위치 인 경우 중첩 접두사 위치 만 정의 할 수 있습니다.

location /a {
        location /a {
               # You can also skip this location and just write
               # your code directly under the parent location
        }
        location /a/b {
        ...
        }
}

부모 위치가 정규식으로 정의되면 중첩 된 위치도 정규식으로 정의해야합니다.

location ~ ^/(a|b) {
        location ~ ^/a {
        ...
        }
        location ~ ^/b {
        ...
        }
}

그러나 부모 위치가 접두사 위치 인 경우 중첩 정규식 위치를 정의 할 수도 있습니다.

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

나는 당신의 첫 문장에 혼란 스러웠지만 당신의 예는 말이됩니다. 마지막 예제에서 접두사 위치 /b에 오류가 발생 한다고 가정 합니다.
Jayen

13
그 첫 문장은 문서에 있어야합니다 .
AndreKR

1
첫 번째 예에서 location /a { }상용구를 제외 하면 순서가 중요합니까?
Meekohi

2
아 내가 절대 오해하지 않았다. 중첩 된 위치는 상위 위치에서 아무것도 상속하지 않습니다.
Meekohi

부모 위치는 정규식이 아닌 위치 일 수 있지만 부모 내의 여러 중첩 된 위치는 모두 정규식 / 비정규 식이어야합니다.
MitchellK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.