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
반응형