Nginx 크로스 도 메 인, session, 쿠키 가 잘못 되 었 습 니 다.
이틀 동안 이러한 수 요 를 만 났 다. 두 항목
a
과 b
이 있 고 a
프로젝트 에서 페이지 호출 b
중의 인터페이스 가 있 으 며 두 항목 의 도 메 인 이름 은 각각 a.com
, b.com
이다.이때 직접 호출 하면 분명히 도 메 인 을 넘 었 다.한바탕 고생 한 후에 문제 가 해결 되 었 으 니, 여기에 해결 방법 을 기록 해라.해결 방법
첫 번 째, 크로스 도 메 인 해결
이것 은 Nginx 의 프 록 시 기능 을 사용 하면 됩 니 다. a 서버 의 Nginx 에 다음 예제 설정 을 추가 합 니 다.
location ~ /xxx/ { proxy_pass
http://b.com
; } 이렇게 해서 경로 에 있 는
/xxx/
요청 을 모두 b.com
로 옮 겼 다.쿠키 를 저장 하지 않 고 session 같은 기능 을 유지 하면 됩 니 다.그러나 이 프로젝트 는 쿠키 를 사용 해 야 하기 때문에 다음 내용 이 있 습 니 다.두 번 째 단계, domain 설정
쿠키 에는 domain 이 있 기 때문에 두 서버 는 일반적으로 다르다. 예 를 들 어
a
서버 가 돌아 오 는 Response Headers 는 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/; domain=a.com
이 고 b
서버 가 돌아 오 는 것 은 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/; domain=b.com
이다. 이때 a
프로젝트 의 페이지 가 b
인 터 페 이 스 를 호출 하면 브 라 우 저 는 인터페이스 가 돌아 오 는 domain 이 a.com
이 아니 라 는 것 을 발견 하면 쿠키 를 저장 하지 않 는 다.세 션 도 무효 야.Nginx 는 이 문 제 를 해결 하기 위해 proxy_cookie_domain
를 도입 했다.예시:location ~ /xxx/ { proxy_cookie_domain
b.com
a.com
; proxy_pass http://b.com
; } 이렇게 하면 Nginx 가 요청 을 받 을 때 domain 의
b.com
을 a.com
로 자동 으로 변환 할 수 있 고 쿠키 설정 이 성공 할 수 있 습 니 다.하지만 이렇게 빛 이 바 뀌 지 않 는 경우 도 있다.예 를 들 어
b
프로젝트 의 domain 은 .b.com
이 고 앞 에 작은 점 이 하나 더 있 으 면 해당 하 는 것 은 proxy 로 바 꿉 니 다.cookie_domain .b.com
a.com
; 안 돼 요?실천 을 통 해 안 돼!!Nginx 문 서 를 보고 해결 방법 을 찾 았 습 니 다.사실, 위의 설정 방식 을 제외 하고 Nginx 는 정규 설정 도 지원 합 니 다.
location ~ /xxx/ { proxy_cookie_domain
~\.?b.com
a.com
; proxy_pass http://b.com
; } 이렇게 하면 domain 중의
.b.com
를 a.com
로 바 꿀 수 있다.세 번 째, path 설정
정상 적 인 상황 에서 상기 두 단 계 를 완성 하면 됩 니 다. 쿠키 의 path 는 일반적으로
path=/
, 즉 모든 요청 이 본 쿠키 에 접근 할 수 있 기 때 문 입 니 다.그러나 일부 서버 는 특정한 등급 의 요청 만 쿠키 에 접근 할 수 있 도록 지정 합 니 다. 예 를 들 어 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/sub/; domain=b.com
그러면 상대 적 인 루트 경로 만 허용 하고 / sub / 로 시작 하 는 요청 경로 만 쿠키 에 접근 할 수 있 습 니 다.이 럴 때 쿠키 가 잘못 되 었 을 수도 있 습 니 다. 이 문 제 를 해결 하기 위해 사용 할 수 있 습 니 다 proxy_cookie_path
.예시:location ~ /xxx/ { proxy_cookie_domain
~\.?b.com
a.com
; proxy_cookie_path /sub/
/
; proxy_pass http://b.com
; } 이렇게 해서
/sub/
등급 의 요청 만 쿠키 에 접근 할 수 있 도록 하고 모든 요청 이 쿠키 에 접근 할 수 있 도록 합 니 다.총결산
몇 시간 을 괴 롭 혔 지만 Nginx 공식 문서 에서 해결 방안 을 찾 았 다.이렇게 많아본문 이 너 에 게 도움 이 되 기 를 바란다.
비고
Nginx 문서 발췌 내용:
Syntax: proxy_cookie_domain off; proxy_cookie_domain
domain
replacement
; Default: proxy_cookie_domain off; Context: http, server, location This directive appeared in version 1.1.15.
Sets a text that should be changed in the domain attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “domain=localhost”. The directive
proxy_cookie_domain
localhost
example.org
; will rewrite this attribute to
domain=example.org
. A dot at the beginning of the domain and replacement strings and the domain attribute is ignored. Matching is case-insensitive.
The domain and replacement strings can contain variables:
proxy_cookie_domain
www.$host
$host
; The directive can also be specified using regular expressions. In this case, domain should start from the “~” symbol. A regular expression can contain named and positional captures, and replacement can reference them:
proxy_cookie_domain
~\.(?P[-0-9a-z]+\.[a-z]+)$
$sl_domain
; There could be several proxy_cookie_domain directives:
proxy_cookie_domain
localhost
example.org
; proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$
$1
; The off parameter cancels the effect of all proxy_cookie_domain directives on the current level:
proxy_cookie_domain off; proxy_cookie_domain
localhost
example.org
; proxy_cookie_domain www.example.org
example.org
; proxy_cookie_path off; proxy_cookie_path
path
replacement
; Default:
proxy_cookie_path off; Context: http, server, location
This directive appeared in version 1.1.15.
Sets a text that should be changed in the path attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “path=/two/some/uri/”. The directive
proxy_cookie_path
/two/
/
; will rewrite this attribute to “path=/some/uri/”.
The path and replacement strings can contain variables:
proxy_cookie_path
$uri
/some$uri
; The directive can also be specified using regular expressions. In this case, path should either start from the “~” symbol for a case-sensitive matching, or from the “~*” symbols for case-insensitive matching. The regular expression can contain named and positional captures, and replacement can reference them:
proxy_cookie_path
~*^/user/([^/]+)
/u/$1
; There could be several proxy_cookie_path directives:
proxy_cookie_path
/one/
/
; proxy_cookie_path /
/two/
; The off parameter cancels the effect of all proxy_cookie_path directives on the current level:
proxy_cookie_path off; proxy_cookie_path
/two/
/
; proxy_cookie_path ~*^/user/([^/]+)
/u/$1
; 참고 문서:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.