Nginx $host 변 수 를 자세히 설명 하고 요청 헤더 헤더 의 key 를 읽 는 방법
$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 변수의 값 은 다음 우선 순위 로 획득:
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';
요약:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.