2017-10-27 3 views
0

로컬 컴퓨터의 포트 8080에서 실행되는 서비스의 역방향 프록시로 nginx를 사용하고 있습니다. 또한 /vp를 사용하여 업스트림에 경로를 추가해야합니다. 이것은 간단하고 나는 그것을위한 작업 location 블록이 있습니다문제 재 작성 URL

location ~ ^/(.*?)$ { 
    proxy_pass $scheme://127.0.0.1:8080/vp/$1; 
    proxy_set_header Host $host; 
    proxy_redirect $scheme://$host/vp/ $scheme://$host/; 
} 

은 그래서 위의 example.com/resource 같은 URL을 지원하는 것이며, 완벽하게 작동합니다.

그러나 나는 또한 example.com/vp/resource과 같은 URL을 지원하고 싶습니다. 이를 위해 다른 location 블록을 작성해야합니다. 그렇지 않으면 업스트림으로 전달되어 /vp/vp/resource으로 작동하지 않습니다.

location ~ ^/vp/(.*?)$ { 
    rewrite /vp(.*?)$ /$1; 
} 

위의 작품은 이제 example.com/vp/resource과 같은 URL을 지원합니다.

하지만 마지막으로 해결하고 싶은 점이 하나 있습니다. 사용자가 example.com/vp/resource에 액세스 할 때 브라우저의 URL을 example.com/resource으로 다시 쓰길 원합니다. 위의 구성은이 작업을 수행하지 않으며 수정할 수있는 방법을 모르겠습니다. 재 작성의 요점은 브라우저에 표시된 URL을 다시 작성하는 것이지만 생각하지는 않습니다. 이것에

location ~ ^/vp/(.*?)$ { 
    rewrite /vp(.*?)$ /$1; 
} 

:

답변

0

우선 나는이 변경 시도

location ~ ^/vp/(.*?)$ { 
    return /$1; 
} 

을 그리고 이것은 주로했다./vp로 시작하는 모든 URI는 브라우저에서 URL을 변경하지 않는 URL로 리디렉션됩니다. 그러나 POST 요청을 작동하지 않는 부작용이있었습니다. 이는 POST 요청이 업스트림 서버에 실제로 도달하지 않기 때문입니다. 대신 POST는 프록시 전달없이 즉시 301 리디렉션을 반환합니다. 그러면 브라우저가 리디렉션 위치를 가져오고 그 위치가 끝납니다.

그래서 요청이 POST가 아니었을 때만 true 301을 선택적으로 반환해야했고, 그럴 때는 proxy_pass이 필요했습니다. If is Evil을 읽은 후에 (location 내부)의 proxy_pass 내부에는 returnrewrite 만 사용할 수 있다는 것을 알았습니다. rewrite에서 읽는 중, 요청의 URI를 다시 작성하지만 즉시 클라이언트로 다시 보내지는 않는다는 것을 알았습니다. 대신 모든 location 블록에 대해 새로 작성된 URI를 실행하고 일치하는 것을 실행합니다. 따라서 제 경우에는 rewrite을 사용하여 원래의 location 블록을 실행해야했습니다.

location ~ ^/vp/(.*?)$ { 
    if ($request_method = POST) { 
     rewrite /vp(.*?)$ /$1; 
    } 

    if ($request_method != POST) { 
     return 301 /$1; 
    } 
} 

location ~ ^/(.*?)$ { 
    proxy_pass http://127.0.0.1:8080/vp/$1; 
    proxy_set_header Host $host; 
    proxy_redirect $scheme://$host/vp/ $scheme://$host/; 
} 
:

내 최종 설정은 다음과 같이보고 결국