nginx는 브라우저 주소를 변경하지 않고 URL을 다시 작성합니다.

nginx는 브라우저 주소를 변경하지 않고 URL을 다시 작성합니다.

요청 URL을 변경하고 싶지만 브라우저 주소가 변경되면 안 됩니다. 이를 달성하기 위해 아래 구성을 시도했습니다.

location /my-website {          

    proxy_pass  http://tomcat/my-website;
}

location =/my-website { 

        rewrite /my-website$(.*) $1/my-website/mypage/index.html last;

}

이렇게 해도 요청은 올바른 주소를 얻지만 브라우저의 주소 표시줄도 변경됩니다.

또한 시도했습니다.

location /my-website {                  
    proxy_pass  http://tomcat;
    rewrite /my-website$(.*) $1/my-website/page/index.html break;

}

이 구성 개선에 대한 제안 사항이 있습니까?

예상 출력

주소 표시 줄:프로토콜://localhost/my-website

실제:프로토콜://localhost/my-website/page

전류 출력

주소 표시 줄:프로토콜://localhost/my-website/page

실제:프로토콜://localhost/my-website/page

시도한 것 :

편집하다

위의 문제는 302 리디렉션에서 발생합니다. 다른 경우에는 브라우저 주소를 변경하지 않고 URL이 변경됩니다. 아래 구성을 사용하여 후자의 경우를 처리하고 있습니다.

location /my-website {      

        proxy_pass  http://tomcat;
        rewrite ^(.*)my-website/src(.*)$ $1my-website/page/src$2 break;


    }

즉, 해당 위치 뒤에는 /src가 오고 작동합니다.

302의 경우 위치는 my-website/이고 위에서 시도한 작업은 실패합니다.

내 파일 구성:

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;



    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"' 
                      '"$upstream_http_location"';    

    rewrite_log  on;

    #log_format  graylog2_format  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" <msec=$msec|connection=$connection|connection_requests=$connection_requests|millis=$request_time>';

    error_log logs/error.log warn;

    sendfile        on;

    keepalive_timeout  65;

    map $http_user_agent $ua_redirect {
    default 'abc';        
    }



    upstream docker-mysite {
        server localhost:9012;
    }


    proxy_set_header     Host $host;
    proxy_set_header     X-Real-IP $remote_addr;
    proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header     X-Forwarded-Host $server_name;
    proxy_set_header     X-Forwarded-Proto $scheme;
    proxy_read_timeout   900;

    client_max_body_size 0; 

server {
    listen       80;      


    access_log  logs/host.access.log  main; 

    #below config works
    location /mysite {                      
        proxy_pass  http://docker-mysite;
        rewrite ^(.*)mysite/src(.*)$ $1mysite/$ua_redirect/src$2 break;

    }
    #below config works but modifies the browser url hence the issue
    location = /mysite {    
        proxy_pass  http://docker-mysite;               
        rewrite /mysite(.*)$ /mysite/$ua_redirect$1 break;

    }

}

}

로그

127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/login?code=token HTTP/1.1" 302 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"http://localhost/mysite/abc
127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/abc HTTP/1.1" 404 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"-

답변1

재작성 논리는 일반 시나리오에서 올바르게 작동하므로 문제가 없습니다. rewrite지시문은 요청 응답이 아닌 요청 URI만 변경하므로 브라우저 URL이 302 리디렉션에 대해 변경됩니다 .

일반적인 302 응답은 다음과 같습니다.

HTTP/1.1 302 Found
Location: http://overrideurlrewriting.com

Location302 응답의 헤더는 브라우저가 언급된 URL을 따르도록 강제합니다.

가능한 해결책은 지시문을 Location사용하여 프록시 응답(302 리디렉션의 경우)에서 헤더를 수정하는 것입니다.proxy_redirect

유용한 링크:

https://stackoverflow.com/a/26025618/2073920

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

답변2

이 시도:

location /my-website {                  
    proxy_pass  http://tomcat;
    rewrite /my-website(.*)$ $1/my-website/page/index.html break;
}

정규 표현식에 잘못된 부분 이 있는 것 같습니다 $. 정규 표현식 끝에 있어야 합니다. 귀하의 의도가 무엇인지 정확히 알 수는 없지만 재작성 대상을 변경하여 다른 페이지가 index.html작동하도록 할 수도 있습니다.

location /my-website {
    proxy_pass  http://tomcat:8000;
    rewrite /my-website(.*)$ /my-website/page$1 break;
}

관련 정보