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_pass 의 NGINX 문서에서 :
proxy_pass 지시문이 URI로 지정된 경우 요청이 서버로 전달되면 위치와 일치하는 정규화 된 요청 URI 부분이 지시문에 지정된 URI로 대체됩니다.
답변
가장 정확한 방법과 모범 사례는 일반적으로 다음과 같습니다.
location /foo/ {
proxy_pass http://localhost:3200/; # note the trailing slash!
}
-
후행 슬래시 in
proxy_pass
의 심각성이 중요$uri
합니다/foo/
. 그러면 프런트 엔드/
의 백엔드 와 일치 하도록 변수가 자동으로 변경됩니다 . 명시 적rewrite
지시문이 필요하지 않습니다 . -
또한, 상기 참고 후행
/
에이location
하나의 점 (예를 들어, 작업에서 귀하의 사이트에 이상한 보이는 URL을 위험을 감수, 그것없이 – 물론 매우 중요하다/fooen
첨가에서/foo/en
).또한, 후행
/
에서location
와proxy_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에서 발생할 수있는 몇 가지 요소가 있으므로이 방법에주의하십시오. 열린 파일 수 등과 같은