>운영 및 유지보수 >엔진스 >nginx 구성 add_header의 함정을 해결하는 방법

nginx 구성 add_header의 함정을 해결하는 방법

王林
王林앞으로
2023-05-17 17:40:061848검색

Foreword

add_header는 헤더 모듈에 정의된 명령으로, 이름에서 알 수 있듯이 http 응답 헤더를 추가하는 데 사용됩니다. 하지만 이는 단지 "추가"일 뿐, 다시 작성하는 것이 아니라는 점에 유의하세요. 따라서 헤더가 이미 존재하는 경우 add_header를 사용하면 문제가 발생합니다. 게다가 낮은 버전의 nginx에서는 add_header가 오류 페이지에서의 사용을 지원하지 않습니다.

이것은 함정이 많은 지침입니다. 처리 단계가 위치 처리보다 늦습니다. 위치에 쓸 수는 있지만 다른 위치에 다시 쓸 경우 이전 위치에서 처리되지 않은 add_header는 손실됩니다. 예:

location = /a {
 add_header a 1;
 rewrite / /b;
}
location = /b {
 add_header b 2;
 return 204;
}

nginx 구성 add_header의 함정을 해결하는 방법

에는 헤더가 1개 없습니다. 그렇죠? 이것은 구덩이입니다!

또 다른 함정은 처음에 언급한 반복적인 문제입니다. 예를 들어 콘텐츠에 대해 content-type을 설정하고 싶은데 전역적으로 default_type이 설정되어 있기 때문에 반복됩니다.

default_type 'text/plain';

location = /a {
 add_header content-type application/json;
 return 200 '"ok"';
}

nginx 구성 add_header의 함정을 해결하는 방법

물론 이 위치에 대해 default_type을 비워 두거나 단순히 add_header를 사용하지 않고 이 위치에 대한 default_type을 직접 수정하는 등 많은 해결 방법이 있습니다.

마지막 큰 함정은 오류 페이지에 적용할 수 없다는 것입니다. 오류 페이지에도 명확하게 정의되어 있습니다. 예를 들면 다음과 같습니다.

location = /a {
 add_header content-type application/json;
 return 404 '"not found"';
}

json으로 응답하고 싶지만 상태 코드가 404이므로 여기의 add_header가 적용되지 않습니다.

nginx 구성 add_header의 함정을 해결하는 방법

이 예제에서는 default_type을 사용하여 문제를 해결할 수 있지만, 다른 헤더라면 어떨까요? 예를 들어, access-control-allow-origin으로 무엇을 해야 합니까? 그렇다면 Lua나 다른 타사 모듈을 사용하여 문제를 해결하는 것 외에는 해결책이 없습니다. 물론 nginx도 이 문제를 인지하고 있어서 버전 1.7.5 이후에는 Always라는 매개변수를 지원한다고 문서에도 나와 있습니다. nginx는 이 문제를 자체적으로 해결했지만 1.6.2 기반의 tengine은 실패할 위기에 처해 있다.

위 내용은 nginx 구성 add_header의 함정을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제