본문 바로가기

nginx, celery, rabbitmq

nginx 경로가 제대로 안먹힐 때, proxy 슬래시(/)의 차이 유무

nginx를 처음 접했을 때 proxy 경로에 슬래시를 주냐 안주냐, 혹은 proxy match 경로에 슬래시를 주냐 안주냐로 엄청 헷갈렸었다.

 

처음에는 상관이 없어 보여서 슬래시를 신경안쓰고 nginx를 실행시키다보니 어쩔때는 되고, 어쩔때는 안되서 정말 답답할 지경이였다.

 

예를 들면 https://example.com/body/hand로 보내고 싶다고 하자.

 

1. location, proxy 둘다 /가 없을 때.

location /body {  
    proxy_pass localhost:3000;
}

-> localhost:3000/body/hand 로 간다.

 

2. location에는 /가 있고, proxy에는 /가 없을 때.

location /body/ {  
    proxy_pass localhost:3000;
}

-> localhost:3000/body/hand/ 로 간다.

 

3. location에는 /가 없고, proxy에는 /가 있을 때.

location /body {  
    proxy_pass localhost:3000/;
}

-> localhost:3000//hand 로 간다.

4. location, proxy 둘다 /가 있을 때.

location /body/ {  
    proxy_pass localhost:3000/;
}

-> localhost:3000/hand 로 간다.

5. location에 /가 없고, proxy에 다른 경로가 있을 때.

location /body {  
    proxy_pass localhost:3000/feet;
}

-> localhost:3000/feet/hand 로 간다.

 

location /body {  
    proxy_pass localhost:3000/feet/;
}

-> localhost:3000/feet//hand 로 간다.

6. location에 /가 없고, proxy에 다른 경로가 있을 때.

location /body/ {  
    proxy_pass localhost:3000/feet;
}

-> localhost:3000/feethand 로 간다.

 

location /body/ {  
    proxy_pass localhost:3000/feet/;
}

-> localhost:3000/feet/hand 로 간다.

 

다음과 같은 경우가 너무 많아서 헷갈릴 수 있다.

 

하지만 무언가 규칙이 있음을 알 수 있을 건데,

 

location의 /는 상관쓰지 말고, proxy_pass 경로에 /가 있다면(/뿐만아니라 다른경로포함), location에 매칭되는 경로는 사라지고 그 뒤의 경로들만 추가로 붙고, proxy_pass 경로에 /(추가적인 경로)가 없다면, 그냥 location에 매칭되는 것까지 전부 뒤에 붙는다고 보면 된다.