nginx 2개의 조건 체크

# nginx 의 if 는 2개 이상의 조건을 (and, or) 사용할 수 없다.
# 이 경우 스트링 변수를 만들어 각 조건이 참일 경우 값을 추가하고
# 최종 이 스트링 변수를 확인하는 방식으로 처리할 수 있다.

# 예제
# user-agent 가 IE 이고 myurl 파라메터가 포함된 요청은 그대로 두고(http->http)
# 그 외의 요청들은 모두 https 로 리다이렉트 한다.(http->https)
# nginx.conf 설정
server {
    listen          [::]:80;
    server_name     ysoftman.test.com;

    set $ok "";
    # ua 가 IE 가 아닌 경우
    if ( $http_user_agent !~* "(msie \d\d?|rv:11|Trident/7.0)") {
        set $ok "noie";
    }
    # myurl=http(s)://xxx 파라메터가 없는 경우
    if ( $arg_myurl !~* "^https?.*" ) {
        set $ok "${ok}nomyurl";
    }
    # ua가 IE 가 아니거나 myurl 파라메터가 아니면 https 로 리다이렉트
    if ( $ok ~* "(noie|nomyurl)") {
        return 302 https://ysoftman.test.com$request_uri;
    }
}

# http -> http 로 변경 없는 예시
curl 'http://ysoftman.test.com/myurl=https://www.google.com' -H 'User-Agent: msie 10 bbbb' -v

# http -> https 로 리다이렉트 되는 예시 (noie)
curl 'http://ysoftman.test.com/myurl=https://www.google.com' -v

# http -> https 로 리다이렉트 되는 예시 (nomyurl)
curl 'http://ysoftman.test.com/' -H 'User-Agent: msie 10 bbbb' -v

# 참고

comments:

댓글 쓰기