Nginx rewrite로 url 경로 변경하기

rewrite 기능을 사용해서 웹서버로 들어오는 url들을 재가공해서 원하는 url로 가도록 재처리 할 수 있습니다.

http로 들어오는 트래픽을 모두 https로 보내기

server {
    listen 80;
    server_name    www.mydomain.com;
    rewrite ^(.*) https://$host$1 permanent;
}

server {
    listen 443;
    server_name    www.mydomain.com;
}

Query string을 모두 삭제하기

Query Parameter보다 검색 친화적인 url을 생성하는 Path variable 형태로 깨끗하게 URL을 유지할 수 있도록 불필요한 Query string을 모두 삭제합니다.

location / {
    set $args '';
    rewrite ^/(.*)$ /$1 permanent;
}

www로 시작하는 url을 루트 도메인으로 보내기

if ($host ~* ^www\.) {
    rewrite ^(.*)$ https://$host$1 permanent;
}

서브도메인으로 시작하는 url을 루트 도메인으로 보내기

if ($host ~* ^([a-z0-9\-]+\.(mydomain.com))$) {
    rewrite ^(.*)$ https://$host$1 permanent;
}

www로 시작하지 않는 도메인을 www 도메인으로 보내기

if ($host !~* ^www\.) {
    rewrite ^(.*)$ https://www.$host$1 permanent;
}

Query string을 Path variable로 변경하기

location ~ /subfolder/post {
    if ($args ~* "^pid=(\d+)&category=linux") {
        set $pid $1;
        set $args '';
        rewrite ^.*$ /subfolder/linux/$pid? permanent;
    }
}

proxy_pass와 rewrite로 Query string을 삭제한 경로를 프록시로 전달하기


location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    set $args '';
    rewrite ^/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:2368;
}

프록시로 경로를 전달할 때는 rewrite로 선처리를 해야 하며, rewrite 끝에 permanent가 아닌 break로 종료해서 rewrite로 변경한 경로를 프록시로 전달해야 합니다.