[server] Nginx 리버스 프록시 + URL 재 작성

Nginx는 포트 80에서 실행 중이며이 방법 /foo으로 포트 경로 가있는 프록시 URL을 반대로 사용합니다 3200.

location /foo {
                proxy_pass http://localhost:3200;
                proxy_redirect     off;
                proxy_set_header   Host $host;
}

이것은 잘 작동하지만 port에 응용 프로그램 3200이 있는데 초기 응용 프로그램을 /foo보내고 싶지 않습니다 . 즉-에 액세스 할 때 앱에서받은 경로 http://localhost/foo/bar/bar되고 싶습니다 . 그래서 위의 위치 블록 에이 줄을 추가하려고했습니다.

rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;

이로 인해 302 리디렉션 (URL 변경)이 발생하지만 301을 원합니다. 어떻게해야합니까?



답변

로컬 호스트로의 리디렉션은 원격 시스템 (예 : 클라이언트의 웹 브라우저)에서 의미가 없습니다. 따라서 귀하의 경우 에는 다시 쓰기 플래그 영구 (301) 또는 리디렉션 (302)을 사용할 수 없습니다.

투명한 다시 쓰기 규칙을 사용하여 다음 설정을 시도하십시오.

location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://localhost:3200;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

curl -i다시 쓰기를 테스트하는 데 사용하십시오 . 규칙을 매우 미세하게 변경하면 nginx가 리디렉션을 수행 할 수 있습니다.


답변

proxy_pass 지시문에 URI를 지정하는 한 재 작성 규칙을 사용하지 않고 간단한 위치 접두사 일치가 작동합니다.

location /foo {
  proxy_pass http://localhost:3200/;
}

지시문 /끝에 추가 내용 을 확인하십시오 proxy_pass. NGINX는 일치하는 접두사를 제거하고 /foo나머지를 URI의 백엔드 서버로 전달합니다 /. 따라서에 http://myserver:80/foo/bar백엔드에 게시합니다 http://localhost:3200/bar.

proxy_passNGINX 문서에서 :

proxy_pass 지시문이 URI로 지정된 경우 요청이 서버로 전달되면 위치와 일치하는 정규화 된 요청 URI 부분이 지시문에 지정된 URI로 대체됩니다.


답변

가장 정확한 방법과 모범 사례는 일반적으로 다음과 같습니다.

location /foo/ {
    proxy_pass http://localhost:3200/; # note the trailing slash!
}

  • 후행 슬래시 inproxy_pass 의 심각성이 중요 $uri합니다 /foo/. 그러면 프런트 엔드 /의 백엔드 와 일치 하도록 변수가 자동으로 변경됩니다 . 명시 적 rewrite지시문이 필요하지 않습니다 .

  • 또한, 상기 참고 후행 /에이location 하나의 점 (예를 들어, 작업에서 귀하의 사이트에 이상한 보이는 URL을 위험을 감수, 그것없이 – 물론 매우 중요하다 /fooen첨가에서 /foo/en).

    또한, 후행 /에서 locationproxy_pass도 어떤 보장 특수 처리 의 문서에 따라, location, 지시 효과적으로 암시을 일으킬 location = /foo {return 301 /foo/;}뿐만 아니라.

    따라서 location위와 같이 슬래시를 사용하여을 정의하면 슬래시없는 접미사 URL /fooen이 유효하지 않을뿐만 아니라 /foo뒤에 슬래시가없는 것도 계속 작동합니다.


참조 문서 :


답변

시험

location /foo {
    proxy_pass http://localhost:3200/;
    ....

또는

location ^~ /foo {
    proxy_pass http://localhost:3200/;
    ....


답변

@Terabuck 아직 답글을 보내지 않은 것에 대해 죄송합니다.

응용 프로그램이 호스트 파일이있는 서버에서 실행되고 있다는 사실에 의존하기 때문에 localhost를 사용하지 않아야합니다. 로컬 호스트는 기본적으로 127.0.0.1로 변환됩니다. 이 호스트 파일이 있어야한다는 내용은 없습니다. 하나를 갖는 것이 매우 일반적입니다.

루프백 인터페이스를 갖는 것은 다시 의존해야 할 또 다른 일반적인 사항이지만 여전히 네트워킹 스택의 루프백 인터페이스에 의존합니다. 이 두 가지가없는 드문 경우입니다. 당신이 이것에 대해 걱정한다면. 적어도 유닉스 / 리눅스에서는 소켓 옵션이 있습니다. 따라서 네트워크 스택이 로컬 호스트에 도달 할 필요가 없습니다. 호스트 OS에서 발생할 수있는 몇 가지 요소가 있으므로이 방법에주의하십시오. 열린 파일 수 등과 같은


답변