안녕하세요, PSJ입니다.
오늘은 NGINX의 url 재작성 방법을 알아보겠습니다.
모든 웹서버 제품들 마다 동일한 기능을 제공하고 있죠, 제 경우에는 사용하는 NAS 기본 웹 서버가 NGINX로 되어 있어 해당 웹서버에 특정 조건을 만족할 경우 다른 url로 이동시켜야 할 일이 있었고, 시간이 지나면 배고파서 까먹는 저를 위해 기록으로 남겨두고자 합니다.
NGINX는 URL을 재작성하는 2가지 방법을 제공합니다. return 및 rewrite 문입니다.
return (URL Redirect)
return 문은 rewrite 보다 간편합니다. server 또는 location 컨텍스트에 return 문을 사용할 수 있으며, client 리소스에 대한 재작성된 URL을 정의해야 합니다.
무슨 말인지 모르겠다구요? 예제를 몇가지 살펴보겠습니다.
구 도메인을 신규 도메인으로 이동
server {
listen 80;
listen 443 ssl;
server_name www.old-domain.com;
return 301 $scheme://www.new-domain.com$request_uri;
}
해당 예제는 www.old-domain.com 도메인의 80/443 http와 https 포트(프로토콜) Listen 하고 들어온 요청 전체를 새로운 위치 $scheme://www.new-domain.com$request_uri 로 301(Moved Permanently)코드와 함께 이동시키고 있습니다.
$scheme
변수는 요청의 프로토콜을 그대로 유지할 수 있습니다. (http or https) $request_uri
변수는 인수를 포함한 전체 URI입니다.
다음 예제는 domain.com 에 www 를 붙이거나 제거하는 return 문 입니다.
# 'www' 추가
server {
listen 80;
listen 443 ssl;
server_name domain.com;
return 301 $scheme://www.domain.com$request_uri;
}
# 'www' 제거
server {
listen 80;
listen 443 ssl;
server_name www.domain.com;
return 301 $scheme://domain.com$request_uri;
}
다음 예제는 80(http)으로 들어온 요청을 https로 return 하는 예입니다.
server {
listen 80;
server_name www.domain.com;
return 301 https://www.domain.com$request_uri;
}
rewrite (URL Rewrite)
rewrite 문의 경우 return 문 보다 복잡한 조건이나, url의 요소를 캡처하거나 변경/추가 해야할 경우 사용합니다.
구문은 아래와 같습니다.
rewrite regex URL [flag];
return 문과의 차이점 은 regex 정규 표현식에 매치되는 경우에만 URL을 다시 작성한다는 점입니다. 아무리 정규 표현식 연산이라고 하더라도 NGINX는 더 많은 처리를 수행해야 하기 때문에 되도록 return 문을 사용하는것이 바람직 합니다.
또 다른 차이점은 호출된 URL이 별도로 정의하지 않는한 바뀌지 않는다는 점입니다.
rewrite ^/documents/(.*)$ /document.html?id=$1 last;
위 예제는 특정 경로를 재지정하는 rewrite 구문입니다. /documents/123 이라는 URI로 접근시 /document.html?id=123 으로 다시 작성할 수 있습니다.
last(flag)의 경우 후속 rewrite 지시문을 건너뛰라는 flag 입니다.
요약
간략하게 NGINX에서 URL 재작성 규칙에 대해 알아봤습니다.
가능하면 return 문을 사용하라, rewrite 문의 경우 더 구체적인 조건이나 URL 요소를 변경/추가 해야하는 경우 사용하며, URL이 변경되지 않는다.
if 문을 통한 조건 지정도 가능하지만, NGINX가 매요청 마다 if 체크를 하게되므로 추천하지 않는다.
정도로 요약할 수 있겠습니다.
이상입니다.
댓글