Nginx 변수 $ host, $ http_host 및 $ server_name의 차이점은 무엇입니까?


42

세 Nginx에 변수 사이의 차이는 무엇입니까 $host, $http_host그리고는 $server_name?

어떤 규칙을 사용해야하는지 잘 모르는 다시 쓰기 규칙이 있습니다.

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

나는 '다시 쓰기 규칙에 ___ 변수 사용'이라고 말하는 것뿐만 아니라 그 사이의 이론적 인 차이점을 설명하는 답변을 찾고 있습니다.


나는도 지정하지 않은 이상 실현 $scheme하고 $host... return 301 /forum/index.php?posts/$arg_p/;잘 작동합니다.
Jeff Widman

대부분의 브라우저는 리디렉션에서 상대 URL을 사용하지만 표준 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html )에는 Location헤더에 절대 URL이 필요합니다 .
크 툴후

답변:


54

$host다른 변수 중 하나의 의미가 특별히 필요하지 않은 한, 사용자 에이전트의 작동 방식에 관계없이 합리적인 무언가를 보장하는 유일한 것이기 때문에 거의 항상 사용해야 합니다.

차이점은 nginx 문서에 설명되어 있습니다 .

  • $host "이 우선 순위 : 요청 라인의 호스트 이름 또는 '호스트'요청 헤더 필드의 호스트 이름 또는 요청과 일치하는 서버 이름"을 포함합니다.
  • $http_host 요청에 HTTP "호스트"헤더 필드가있는 경우 해당 컨텐츠를 포함합니다.
  • $server_nameserver_namenginx 구성에 정의 된대로 요청을 처리 한 가상 호스트를 포함합니다 . server에 여러 개가 포함 된 경우 server_name첫 번째 변수 만이 변수에 나타납니다.

사용자 에이전트가 Host : 헤더가 아닌 요청 라인에서 호스트 이름을 보내는 것이 합법적이므로 프록시에 연결할 때를 제외하고는 거의 수행되지 않지만이를 고려해야합니다.

또한 사용자 에이전트가 호스트 이름을 전혀 보내지 않는 경우 (예 : 고대 HTTP / 1.0 요청 및 최신 잘못 작성된 소프트웨어)도 고려해야합니다. 여러 개의 웹 사이트를 제공하거나 서버에 단일 웹 사이트 만있는 경우 단일 가상 호스트를 통해 모든 것을 처리 할 수있는 서비스를 제공하지 않는 범용 가상 호스트로 전환하여이를 수행 할 수 있습니다. . 후자의 경우에도이를 설명해야합니다.

$host변수는 HTTP 요청을 형성 할 때 사용자 에이전트가 할 수있는 모든 가능한 것들 차지한다.


2
반면에 UA의 필드에 임의의 내용이 포함될 수있는 $server_name경우 안전 Host:합니다.
크 툴후

1
$ http_host의 이름이 $ hostname으로 바뀌 었습니까? Nginx doc에서 그러한 변수를 찾을 수 없습니다. $ hostname은 내가 생각하는 것과 가장 비슷합니다.
darkbaby123

3
@ darkbaby123 아니요, 이름이 바뀌지 않았습니다. 설명서를 참조하십시오 .
Michael Hampton

1
아, 이제 http_ <name> 변수의 의미를 이해합니다. 감사합니다!
darkbaby123

0

허용 된 답변에 언급되지 않은 또 다른 중요한 사항을 추가하고 싶습니다.

$host않는 NOT 동안, 포트 번호가 $http_hostDO 포트 번호를 포함한다.

편집 : 항상 그런 것은 아닙니다.

헤더 "add_header Y-blog-http_host"$ http_host "를 항상 설정했습니다."

그런 다음 curl -I -L domain.com:80(또는 443) 헤더에는 포트 번호가 전혀 표시되지 않습니다. nginx-extra 1.10.3으로 검증되었습니다. 일반적인 http 포트 또는 nginx 구성이기 때문입니까? 이 의견은 사물이 항상 당신이 생각하는 방식으로 행동하는 것은 아닙니다 .


0

나는 또한 이것을 잠시 동안 고투했다. $ http_XXXXX가 선언 된 모든 헤더 변수를 참조한다는 것을 알았을 때 분명해졌습니다.

따라서 $ http_user_agent, $ http_referer는 "USER AGENT", "REFERER"는 소문자와 밑줄로 표시됩니다. 이것은 많은 NGINX 구성 샘플에서 $ http_upgrade가 어디에서 왔는지 설명했습니다.

https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx 에서 읽으십시오.

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