크로스 필드 이상 및 nginx 의 underscoresin_headers on

4470 단어
최근 에 하나의 대리 시스템 이 출시 되 었 는데 nginx 대리 제3자 응용 을 통 해 서로 다른 지역 간 의 방화벽 제한 을 뚫 고 방문 전략의 일부 업 무 를 실현 했다.
그 동안 시스템 대리 고객 의 특정한 응용 을 할 때 크로스 도 메 인 문 제 를 만 났 습 니 다. 자신의 관성 사고방식 의 논리 로 인해 하루 종일 걸 려 서 해결 되 었 고 동료 가 협조 하여 완성 되 었 기 때문에 이 기록 은 경각 심 을 가지 게 되 었 습 니 다!
 
장면 재현
 고객 환경:
응용 서버: nginx 배치 부하 균형 실현
응용 관련 ws 서버: nginx 배치 부하 균형 실현
로 컬 환경:
프 록 시 시스템: nginx 를 통 해 프 록 시 구현
구체 적 인 조작:
프 록 시 시스템 에 각각 클 라 이언 트 애플 리 케 이 션 과 ws 서버 를 추가 하고 nginx. conf 를 통 해 두 개의 server 블록 을 설정 하여 이 루어 집 니 다.
그 결과 브 라 우 저 에서 클 라 이언 트 애플 리 케 이 션 서버 를 방문 할 때 클 라 이언 트 애플 리 케 이 션 이 ajax 를 통 해 보 낸 ws 요청 은 모두 도 메 인 이상 을 던 졌 습 니 다 (XML HttpRequest cannot load '. No' access - control - Allow - Origin 'header is present on the required resource. Origin' is therefore not allowed access.).
 
 
크로스 필드 에 대하 여
 
무엇이 크로스 필드 입 니까?
크로스 도 메 인 접근 은 브 라 우 저의 제한 입 니 다. 그 이 유 는 안전 문 제 를 위 한 것 입 니 다.
브 라 우 저 는 같은 소스 정책 을 통 해 도 메 인 제한 을 실현 합 니 다. 같은 소스 정책 은 도 메 인 이름, 프로 토 콜, 포트 가 같 아야 같은 소스 입 니 다.
예 를 들 어 a 페이지 는 b 페이지 자원 을 가 져 오 려 고 합 니 다. 만약 에 a, b 페이지 의 프로 토 콜, 도 메 인 이름, 포트, 하위 도 메 인 이름 이 다 르 면 방문 행동 은 모두 도 메 인 을 뛰 어 넘 습 니 다.
 
장면 재현
크로스 도 메 인 문제 가 발생 했 을 때 첫 번 째 반응 은 동원 전략 이 었 습 니 다. 프 록 시 시스템 이 두 개의 server 블록 을 설정 하여 대리 할 생각 이 었 습 니 다. 그리고 두 개의 servername 의 도 메 인 이름 에 동원 문제 가 발생 했 습 니 다.
그래서 클 라 이언 트 애플 리 케 이 션 과 ws 서버 를 하나의 server 블록 으로 어떻게 실현 하 느 냐 에 많은 시간 이 걸 렸 습 니 다. 관건 은 클 라 이언 트 ajax 가 요청 한 ws 가 전체 경로 입 니 다. 예 를 들 어http://aaa:8080/ws이것 은 로 컬 에서 aax 요청 을 보 내 는 것 은 aaa 도 메 인 이름 에 직접 보 내 는 것 이 고 고객 은 도 메 인 이름 을 사용 합 니 다.http://xxx:8080/app,
고객 의 ws 요청 이 상대 적 인 경로 로 바 뀌 지 않 는 한 / ws 와 같은 소스 문제 가 발생 할 수 있 습 니 다.
사용 자 는 제어 할 수 없 기 때문에 server 블록 이 실현 하 는 방안 은 전혀 불가능 합 니 다!
 
반나절 을 고민 하 며 뒤로 물 러 나 고 그 다음 에 프 록 시 ws 서버 에 http 헤드 (Access - Control - Allow - Origin) 를 설정 하여 현재 고객 의 수 요 를 해결 하려 고 합 니 다. 이러한 부족 한 점 은 사용자 가 http 헤드 를 설정 하 였 는 지 제어 할 수 없 기 때 문 입 니 다. 만약 에 고객 이 추가 하면 저희 가 다시 설정 하면 문제 가 있 습 니 다. 테스트 를 통 해사용자 의 ws 서버 에 Access - Control - Allow - Origin 이 설정 되 어 있 기 때문에 최종 적 으로 이상 을 던 집 니 다 (XML HttpRequestcannot load. The 'access - Control - Allow - Origin' header contains multiple values' *, * ', but only one is allowed. Origin' is therefore notallowed access).
여기 서 Access - Control - Allow - Origin 을 설정 하 는 데 반나절 이 걸 렸 습 니 다. 설정 하지 않 으 면 최초의 크로스 도 메 인 이상 이 발생 할 수 있 기 때문에 2 층 프 록 시 에 해당 하 는 http 헤드 정 보 를 추가 하여 multiple values' * 를 설정 하 였 습 니 다.
 
CORS 프로 토 콜
 
cors 가 무엇 입 니까?
CORS 는 W3C 표준 으로 전 칭 '크로스 - originresource sharing' (Cross - originresource sharing) 이다.
브 라 우 저가 크로스 소스 서버 에 XML HttpRequest 요청 을 할 수 있 도록 해 AJAX 가 같은 소스 로 만 사용 할 수 있 는 제한 을 극복 했다.
전체 CORS 통신 과정 은 브 라 우 저가 자동 으로 완성 되 므 로 사용자 가 참여 할 필요 가 없습니다.개발 자 에 게 CORS 통신 은 같은 소스 의 AJAX 통신 과 차이 가 없고 코드 가 똑 같 습 니 다.브 라 우 저 는 AJAX 가 크로스 소스 를 요청 하 는 것 을 발견 하면 자동 으로 추가 헤더 정 보 를 추가 하고, 때로는 추가 요청 이 한 번 더 나 오기 도 하지만 사용 자 는 감각 이 없다.
따라서 CORS 통신 을 실현 하 는 관건 은 서버 다.서버 가 CORS 인 터 페 이 스 를 실현 하면 크로스 소스 통신 이 가능 하 다.
서버 가 클 라 이언 트 에 응답 할 때 Access - Control - Allow - Origin 헤드 정 보 를 가 져 옵 니 다. (이 헤 더 는 서버 가 CORS 를 지원 하도록 하 는 것 입 니 다.)
 
cors 에서 흔히 볼 수 있 는 header:
Access-Control-Allow-Origin:http://kbiao.me        ”http://kbiao.me“      
Access-Control-Max-Age:3628800     3628800  ,           ,       
Access-Control-Allow-Methods:GET,PUT, DELETE       GET、PUT、DELETE      
Access-Control-Allow-Headers:content-type            content-type 

 
해결 방법
 jsonp 는 대상 서버 가 callback 함수 에 맞 춰 야 합 니 다.
iframe 은 대상 서버 가 window. name 에 응답 해 야 합 니 다.
CORS 는 서버 설정 헤더: Access - Control - Allow - Origin 이 필요 합 니 다.
nginx 역방향 프 록 시 는 대상 서버 와 협조 하지 않 고 모든 브 라 우 저 를 지원 합 니 다.
nginx 를 사용 하 는 것 을 권장 합 니 다.
 
 
underscores_in_headers on 
 
소개 하 다.
nginx 프 록 시 는 기본적으로 header 에 있 는 인자 의 '' 밑줄 을 제거 하기 때문에 배경 서버 에서 '' 선 이 있 는 인자 이름 을 가 져 올 수 없습니다.
underscores_in_headers on; #      off,    header name      ,    。

 
 장면 재현
2 층 에이전트 에 의 한 이상 이 발생 한 후에 도 메 인 을 뛰 어 넘 는 문제 가 아니 라 는 것 을 알 게 되 었 습 니 다. 마지막 으로 전면적으로 조사 한 결과 ws 의 요청 은 모두 200 이지 만 응답 하 는 데 이 터 는 모두 비어 있 습 니 다.
뉴스 요청 시 파 라 메 터 를 가지 고 있 지 않 기 때 문 입 니 다. 진실 은 바로 여기에 있 습 니 다. 고객 이 요청 한 파 라 메 터 는 '' 을 포함 하고 nginx 는 기본적으로 무시 합 니 다.
이전의 추측 을 뒤 집 어 엎 고 에이전트 의 두 서버 블록 에 underscoresin_headers on, 문 제 는 이것으로 해결 합 니 다.

좋은 웹페이지 즐겨찾기