nginx 프록시 패스 리디렉션은 포트를 무시합니다


34

그래서 nginx conf에서 node.js 앱을 가리킬 때 가상 경로를 설정하고 있습니다. 관련 섹션은 다음과 같습니다.

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

node.js 앱 (익스프레스 앱)이 리디렉션을 호출하는 경우를 제외하고는 훌륭하게 작동합니다.

예를 들어, dev 상자는 포트 8080에서 nginx를 실행하므로 노드 앱의 루트 URL은 다음과 같습니다.

http : // localhost : 8080 / app

노드에서 '/ app'로 리디렉션을 호출하면 실제 리디렉션은 다음으로 이동합니다.

http : // localhost / app


다음은 사용을 제안하는 답변입니다. proxy_set_header Host $ http_host; 그러나 아무도 취약점 (호스트 헤더 공격)을 일으킬 수 있다고 말한 사람은 없습니다. 여기 예를 들어 공격 과 추가 정보를 원하시면 여기

답변:


14

문제는 Node.js 애플리케이션이 경로 재 지정을 올바르게 발행하지 않는다는 것입니다. proxy_redirectnginx에서 이것을 수정하는 데 사용할 수 있습니다 .

proxy_redirect http://localhost/ http://localhost:8080/;

47

Jenkins가 nginx 뒤에서 실행되는 것과 동일한 문제를 해결해야했습니다. HostJenkins에게 보내는 헤더에 서버 포트를 포함시키는 것이 나를 위해했습니다 .

proxy_set_header Host $host:$server_port;

희망이 도움이됩니다.


3
빙고. @ mgorven이 말했듯이 nginx가 호스트를 잘못 전달하기 때문에
Eric

5

위의 솔루션을 시도했지만 노드 응용 프로그램이 " http://nodeapp.com:8080/new/location " 과 같이 위치 헤더에서 정규화 된 URL을 발급 할 때마다 모두 실패했습니다.

그래서 $ http_host를 사용하여 호스트와 포트를 전달했습니다. 일치하는 ~ ^를 사용하여 URL을 완전히 다시 작성하십시오.

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

이 경우 노드 서버는 8080에서 실행되고 nginx 프록시는 8000에서 실행됩니다. 이는 위치 헤더의 모든 정규화 된 URL을 다시 작성해야 함을 의미합니다. 희망이 누군가를 도와주세요!


4

이 질문 에 대한 대화에 따라 올바른 해결 방법은 프록시의 Host헤더 지시문 을 조정하는 것 입니다.

이것을 변경하십시오 :

proxy_set_header Host $host;

이에:

proxy_set_header Host $http_host;

$http_host포트를 포함하는 HTTP HOST 헤더에 지정된 값을 보유합니다. 리디렉션은 OP 설정에 대한 추가 사용자 정의없이 사용자 정의 포트를 선택해야합니다.

이 답변들 (동일한 티켓)은 더 자세히 설명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.