Nginx $host 변 수 를 자세히 설명 하고 요청 헤더 헤더 의 key 를 읽 는 방법

6241 단어 nginxNginx$host
원문 연결:https://www.jianshu.com/p/0850db5af284
 
$host 변수의 공식 설명
$host:in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request
host 변수의 값 은 다음 우선 순위 로 획득:
  • 요청 행 의 host.
  • 머리 에 있 는 Host 머리 를 요청 합 니 다.
  • 요청 과 일치 하 는 server name.
  • 요청 줄 의 host 가 무엇 입 니까?
    HTTP 는 신뢰 할 수 있 는 전송 계층 프로 토 콜 위 에 세 워 진 텍스트 프로 토 콜 이라는 것 을 알 고 있 습 니 다.이 전송 계층 프로 토 콜 이 신뢰 할 수 있다 면 연결 을 위 한 것 입 니 다.TCP 의 보급 정도 로 인해 HTTP 하부 프로 토 콜 이 현재 의 표준 이 되 었 다.그러나 HTTP 는 TCP 위 에 만 있 는 것 이 아니 라 는 것 을 알 아야 한다.신뢰 할 수 있 는 연결 을 위 한 전송 계층 프로 토 콜 이 라면 HTTP 를 전송 할 수 있 습 니 다.아래 에서 말 하 는 HTTP 는 모두 TCP 에 탑 재 된 HTTP 를 가리킨다.
    HTTP 요청 과정 은 이 렇 습 니 다. 클 라 이언 트 는 서버 와 TCP 연결 을 한 다음 에 서버 측 과 요청 하고 답장 하 는 송 수신 을 합 니 다.요청 은 요청 행, 요청 헤드, 요청 체 를 포함 하 며, 요청 방법 에 따라 요청 체 를 선택 할 수 있 습 니 다.
    요청 줄 을 보 내기 전에 클 라 이언 트 와 서버 가 연결 되 었 습 니 다.따라서 요청 줄 에 서버 정보 가 필요 하지 않 습 니 다.우 리 는 telnet 로 테스트 합 니 다. 예 를 들 어:
    GET /index.php HTTP/1.1
    

    이것 이 완전한 HTTP 요청 줄 입 니 다.요청 줄 에 서버 정보 가 필요 하지 않 지만 요청 줄 에 서버 정 보 를 포함 할 수 있 습 니 다.예 를 들 면:
    GET www.test.info/index.php HTTP/1.1
    

    둘 을 비교 해 보면 요청 줄 의 host 가 무엇 인지 쉽게 이해 할 수 있다.첫 번 째 요청 줄 에는 host 가 없고 두 번 째 요청 줄 에는 host 를 가 져 왔 습 니 다. www. test. info 입 니 다.
    Host 요청 헤더 와 HTTP / 1.0, HTTP / 1.1
    요청 줄 아래 에 열 요청 헤더 가 있 습 니 다.이 요청 헤드 는 HTTP / 1.0 에서 선택 할 수 있 으 며, HTTP / 1.0 은 Host 요청 헤드 를 지원 하지 않 습 니 다.HTTP / 1.1 에서 Host 요청 머리 가 존재 해 야 합 니 다. 그렇지 않 으 면 400 Bad Request 로 돌아 갑 니 다. 예 를 들 어 telnet 연결 을 사용 합 니 다.
    GET /index.php HTTP/1.1
    
    HTTP/1.1 400 Bad Request
    Server: nginx/1.4.6 (Ubuntu)
    

    하지만 HTTP / 1.0 은 Host 머리 를 지원 하지 않 기 때문에 요청 합 니 다. 이 Host 를 가 져 올 필요 가 없습니다. 저희 도 테스트 해 보 겠 습 니 다.
    HEAD /rec/app/detail/youxidaren.html HTTP/1.0
    
    HTTP/1.1 404 NOT FOUND
    Server: nginx/1.4.6 (Ubuntu)
    

    400 으로 돌아 가지 않 고 404 로 돌아 간 것 을 볼 수 있 습 니 다. 이 요청 은 nginx 로 처리 되 었 습 니 다. 그 중 하 나 를 명중 시 킨 '가상 호스트' 입 니 다. nginx 아래 에 가서 access 를 보 겠 습 니 다.log, 로그 가 첫 번 째 nginx 가상 호스트 설정 로그 파일 에 쓰 여 있 는 것 을 보 았 습 니 다. http 1.0 상황 에서 host 머리 를 가지 고 있 지 않 습 니 다. 기본적으로 nginx 첫 번 째 가상 호스트 에서 처리 해 달라 고 요청 하 였 습 니 다.
    요청 과 일치 하 는 server name
    server name 은 Nginx 프로필 에서 server 블록 에서 servername 명령 설정 값 입 니 다.하나의 server 는 server 를 여러 번 사용 할 수 있 습 니 다.가상 호스트예 를 들 면:
    server {  
        listen      80;  
        server_name example.org www.example.org;  
        ...  
    }  
      
    server {  
        listen      80;  
        server_name example.net www.example.net;  
        ...  
    }  
      
    server {  
        listen      80;  
        server_name example.com www.example.com;  
        ...  
    }  
    

    가상 호스트 에 대한 확인 방법 은 Nginx 의 공식 문 서 를 참조 하 십시오.
    이 설정 에서 nginx 는 요청 한 "Host" 헤드 만 검사 하여 이 요청 을 어느 가상 호스트 에서 처리 해 야 할 지 결정 합 니 다.호스트 헤드 가 임의의 가상 호스트 와 일치 하지 않 거나 요청 에 호스트 헤드 가 전혀 포함 되 어 있 지 않 으 면 nginx 는 이 포트 를 정의 하 는 기본 가상 호스트 에 요청 을 나 누 어 줍 니 다.위 설정 에서 첫 번 째 로 열 거 된 가상 호스트 인 nginx 의 기본 가상 호스트 입 니 다. 이것 은 nginx 의 기본 행동 입 니 다.그리고 어떤 호스트 를 기본 가상 호스트 로 명시 적 으로 설정 할 수 있 습 니 다. 즉, "listen" 명령 에 "default" 을 설정 할 수 있 습 니 다.server "인자: server {listen 80 default server; server name example. net www. example. net;...}
    이것 은 위의 HTTP 1.0 요청 을 설명 합 니 다. Host 헤드 를 가지 고 있 지 않 고 기본적으로 첫 번 째 설정 의 server 에 와 서 처 리 했 습 니 다.그리고 www. test. info 라 는 도 메 인 이름 을 기본 호스트 default 로 설정 하 는 것 을 테스트 해 보 겠 습 니 다.server, 요청 이 www. test. info 라 는 server 에 정상적으로 올 수 있 는 지 확인 하 세 요.
    nginx 설정 수정:
    server {
        listen      80 default_server;
        server_name www.test.info
    }
    

    다시 요청:
    HEAD /index.php HTTP/1.0
    
    HTTP/1.1 200 OK
    Server: nginx/1.4.6 (Ubuntu)
    

    실제 테스트, 정상, default서버 가 확실히 작 용 했 습 니 다.
    연장: Nginx 의 $host 와 $httphost 의 차이
    $host 는 nginx 의 공식 변수 입 니 다. 공식 적 으로 $http 을 조회 할 수 있 습 니 다.host 는 요청 헤더 헤더 에 있 는 key 를 읽 습 니 다. 모든 요청 헤더 에 있 는 key 재 nginx 에 서 는 소문 자 와 밑줄 을 통 해 nginx 가 읽 을 수 있 습 니 다.예 를 들 어 header 에 있 는 Host 는 $http 로 전 환 됩 니 다.host, user_에이전트 는 $http 로 전환 가능user_agent。 그래서 header 의 요청 헤더 라면 nginx 에서 읽 을 수 있 습 니 다. 테스트 해 보 겠 습 니 다.
    HEAD /rec/app/detail/youxidaren.html HTTP/1.1 
    Host: mo.ouwan.com
    Content-type: html/txt
    Test-key: test-value
    
    HTTP/1.1 200 OK
    Server: nginx/1.4.6 (Ubuntu)
    Date: Thu, 22 Mar 2018 12:28:56 GMT
    Content-Type: text/html; charset=utf-8
    Connection: keep-alive
    Vary: Cookie
    #               。
    x_host: mo.ouwan.com
    x_test_key: test-value
    x_content_type: html/txt
    

    물론 이 머리 몇 개가 response 에 표 시 될 수 있 는 것 은 nginx 에 add 를 추 가 했 기 때 문 입 니 다.header 제어:
    location / {
            add_header x_host   $http_host;
            add_header x_test_key $http_test_key;
            add_header x_content_type $http_content_type;
    }
    

    $http_header 의 응용: 우리 의 한 프로젝트 가 두 서버 아래 에 배 치 된 다음 에 다른 서버 에 nginx 리 액 션 프 록 시 를 구축 합 니 다. 리 액 션 프 록 시가 두 서버 에 요청 을 전달 할 때 그들의 로 그 는 실제 요청 한 사용자 IP 가 아 닌 역방향 프 록 시 ip 을 기록 합 니 다. 이 때 proxy 를 설정 할 수 있 습 니 다.set_header 는 실제 IP 를 X - forward - for 또는 X - Real - IP 에 설정 하여 백 엔 드 서버 에 전달 한 다음 백 엔 드 서버 에서 http 를 통 해 읽 습 니 다.x_real_ip 로 실제 IP 를 읽 고 access 에 기록 합 니 다.아래
     location / {
                    proxy_pass http://tg_web_cluster;
                    proxy_set_header Host      $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    # proxy_set_header X-Forwarded-Proto $scheme;
            }
    

    로그 의 형식 은 첫 번 째 IP 를 방금 전 송 된 머리 X - Real - IP 로 바 꾸 면 사용자 IP 를 기록 할 수 있 습 니 다.
        log_format tg_log '$http_x_real_ip - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$gzip_ratio" - $request_time';
    
    

    요약:
  • $host 변수의 값 은 다음 과 같은 우선 순위 로 획득:
  • 요청 행 의 host.
  • 머리 에 있 는 Host 머리 를 요청 합 니 다.
  • 요청 과 일치 하 는 server name.
  • nginx 는 $httpheader 는 요청 헤더 의 값 을 읽 고 실제 응용 하면 부하 가 균형 잡 힐 때 IP 를 읽 을 수 있 습 니 다
  • 저자: 대부호 링크:https://www.jianshu.com/p/0850db5af284 출처: 간 서 간 서 저작권 은 작가 의 소유 이 며, 어떠한 형식의 전재 도 작가 에 게 연락 하여 권한 을 수 여 받 고 출처 를 밝 혀 주 십시오.

    좋은 웹페이지 즐겨찾기