Daylogs/Nginx

nginx: proxy_pass 의 마지막 슬래시 여부에 따른 처리

ohgyun 2015. 11. 5. 21:02
발생일: 2015.11.05

키워드: nginx, proxy_pass, 엔진엑스, 프록시

문제:
nginx 에서 proxy_pass 의 마지막 슬래시 여부에 따라 전달되는 주소가 달라지는 것 같다.
잘 이해하고 가자.


해결책:

proxy_pass 에 URI를 생략하는 경우, 요청으로 들어온 전체 Path가 프록시 서버로 전달된다.
proxy_pass 에 URI를 정의하는 경우(`/` 포함),
location 블럭에서 매칭된 나머지 주소만 프록시 주소에 정의된 URI에 붙어 전달된다.


요청 URL이 아래와 같다고 가정하면,
 
    http://example.com/foo/bar/baz

각 룰 케이스 별로 프록시로 전달되는 path는 아래와 같다.



Case) location 과 proxy_pass 에 / 가 없는 경우

     location ^~ /foo {
         proxy_pass http://localhost:3000;
     }

     --> 프록시로 서버로 전달되는 path: /foo/bar/baz


Case) location 에 / 가 있고, proxy_pass 에 / 가 없는 경우

     location ^~ /foo/ {
         proxy_pass http://localhost:3000;
     }

     --> 프록시로 서버로 전달되는 path: /foo/bar/baz


Case) location 에 / 가 없고, proxy_pass 에 / 가 있는 경우

     location ^~ /foo {
         proxy_pass http://localhost:3000/;
     }

     --> 프록시로 서버로 전달되는 path: //bar/baz
           location 블럭에서 매칭된 나머지 주소(/bar/baz)가 프록시 주소의 마지막에 붙어 전달된다.


Case) location 에 / 가 있고, proxy_pass 에도 / 가 있는 경우

     location ^~ /foo/ {
         proxy_pass http://localhost:3000/;
     }

     --> 프록시로 서버로 전달되는 path: /bar/baz
           마찬가지로, location 블럭에서 매칭된 나머지 주소(bar/baz)가 프록시 주소의 마지막에 붙어 전달된다.


Case) location 에 / 가 있고, proxy_pass 에 URI가 있는 경우

     location ^~ /foo/ {
         proxy_pass http://localhost:3000/foo;
     }

     --> 프록시로 서버로 전달되는 path: /foobar/baz
           변경 없이, location 블럭에서 매칭된 나머지 주소(bar/baz)가 프록시 주소의 마지막에 붙어 전달된다.


Case) location 에 / 가 없고, proxy_pass 에 URI가 있는 경우

     location ^~ /foo {
         proxy_pass http://localhost:3000/foo;
     }

     --> 프록시로 서버로 전달되는 path: /foo/bar/baz
           마찬가지로, location 블럭에서 매칭된 나머지 주소(/bar/baz)가 프록시 주소의 마지막에 붙어 전달된다.


Case) location 에 / 가 없고, proxy_pass 에 URI와 매칭되지 않는 패턴이 존재하는 경우

     location ^~ /foo {
         proxy_pass http://localhost:3000/xxx;
     }

     --> 프록시로 서버로 전달되는 path: /xxx/bar/baz
           마찬가지로, location 블럭에서 매칭된 나머지 주소(/bar/baz)가 프록시 주소의 마지막에 붙어 전달된다.
           proxy_pass URI가 요청 URI와 동일한 패턴인지 여부는 관계 없다.


Case) location 에 / 가 없고, proxy_pass 에 URI가 있고 마지막에 / 가 있는 경우

     location ^~ /foo {
         proxy_pass http://localhost:3000/foo/;
     }

     --> 프록시로 서버로 전달되는 path: /foo//bar/baz




반응형