nginx를 사용하여 쿠키 교차 도메인 액세스 문제를 해결하는 방법

PHPz
풀어 주다: 2023-05-26 23:21:21
앞으로
3345명이 탐색했습니다.

1. 앞에 작성

최근에는 Alibaba Cloud의 4개 서버 프로젝트를 고객이 제공한 새 프로젝트로 마이그레이션해야 합니다. 원래 4개 서버는 1차 도메인 이름과 2차 도메인 이름을 사용했습니다. 예를 들어 aaa.abc.com, bbb.abc.com 및 ccc.abc.com입니다. 그 중 aaa.abc.com은 쿠키의 정보를 .abc.com으로 설정하여 로그인합니다. 다른 시스템에서는 이 쿠키를 공유할 수 있습니다. 그러나 4개의 새로운 서버에는 도메인 이름이 적용되지 않고 4개의 IP만 있습니다:

192.168.0.1 Single Sign-On 서버

192.168.0.2

192.168.0.3

192.168.0.4

왜냐하면 각 서버에는 두 프로젝트 모두 싱글 사인온(Single Sign-On)을 사용하고 있어서 새로운 공유 로그인 방식을 수정하는데 시간이 너무 많이 걸려서 인터넷에서 쿠키 크로스 도메인 로그인을 검색해서 시도해보고 192.168.0.1 싱글 사인에서 도메인을 여러 번 설정했습니다. -서버 2, 3, 4개에서는 브라우저가 허용하지 않기 때문에 결과가 이상적이지 않습니다. 나중에 우연히 nginx가 속임수를 통해 쿠키를 공유할 수 있다는 것을 보았습니다. 그래서 원래 회사에서는 nginx를 배포하고 이런 용도를 갖고 있는 줄 알았습니다.

2. 원본 nginx 구성

먼저 nginx 설치에 대해 이야기하겠습니다. 인터넷에 많은 튜토리얼이 있으므로 Linux에서 nginx 설치 및 시작에 대해서는 자세히 설명하지 않겠습니다. 주목해야 할 것은 ./configure 이후의 다양한 with입니다. 구성 시작 프로세스 중에 몇 가지 문제가 발생했습니다:

nginx: [emerg] unknown directive "aio" in
로그인 후 복사

plus --with-file-aio

코드 복사 코드는 다음과 같습니다:

nginx 시작 : nginx: [ emerg] inet6 소켓은 이 플랫폼에서

의 "[::]:80"에 지원되지 않습니다. --with-ipv6을 끝에 추가하면 더 쉽게 할 수 있습니다.

설치가 완료된 후. 주로 nginx.conf 구성

원래 서버 구성 nginx.conf:

# for more information on configuration, see:
#  * official english documentation: http://nginx.org/en/docs/
#  * official russian documentation: http://nginx.org/ru/docs/

user root;
worker_processes 2;
worker_cpu_affinity 1000 0100;
error_log logs/error.log;
pid logs/nginx.pid;


events {
  worker_connections 2048;
}

http {
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';

  access_log logs/access.log main;

  gzip on;
  gzip_min_length 1000;
  gzip_buffers   4 8k;
  gzip_types    text/plain application/javascript application/x-javascript text/css application/xml;

  client_max_body_size 8m;
  client_body_buffer_size 128k;

  sendfile      on;
  tcp_nopush     on;
  tcp_nodelay     on;
  keepalive_timeout  65;
  types_hash_max_size 2048;

  include       mime.types;
  default_type    application/octet-stream;

  connection_pool_size 512;
  aio on;
  open_file_cache max=1000 inactive=20s;

  # load modular configuration files from the /etc/nginx/conf.d directory.
  # see http://nginx.org/en/docs/ngx_core_module.html#include
  # for more information.
  #  主要配置在这里,nginx.conf配置都是一样
  include /usr/local/nginx/conf/conf.d/*.conf;

  server {
    listen    80 default_server;
    listen [::]:80 ipv6only=on default_server;
    server_name _;
    root     html;

    # load configuration files for the default server block.
    include /usr/local/nginx/conf/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
      location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
      location = /50x.html {
    }
  }
}
로그인 후 복사

원래 서버
conf.d/*.conf 구성은 reverse-proxy.conf

server
{
  listen 80;
  server_name m.abc.com.cn;
  location / {
    root  /usr/share/nginx/html/;
    index index.html index.htm;
  }
  location ~ \.(jsp|do)?$ {
    proxy_redirect off;
    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_pass http://localhost:8084;
  }
  if ($http_user_agent ~* "qihoobot|baiduspider|googlebot|googlebot-mobile|googlebot-image|mediapartners-google|adsbot-google|feedfetcher-google|yahoo! slurp|yahoo! slurp china|youdaobot|sosospider|sogou spider|sogou web spider|msnbot|ia_archiver|tomato bot") { 
        return 403; 
    }
  access_log /home/logs/nginx/m.abc.com.cn_access.log;
}
 
server
{
  listen 80;
  server_name store.abc.com.cn *.store.abc.com.cn;
  location / {
    proxy_redirect off;
    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_pass http://localhost:8081;
  }
  access_log /home/logs/nginx/store.abc.com.cn_access.log;
}

server
{
  listen 80;
  server_name shopcenter.abc.com.cn;
  location / {
    proxy_redirect off;
    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_pass http://10.45.100.222:8082;
  }
  access_log /home/logs/nginx/shopcenter.abc.com.cn_access.log;
}
 
server
{
  listen 80;
  server_name search.abc.com.cn;
  location / {
    proxy_redirect off;
    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_pass http://10.45.100.68:8083;
  }
  access_log /home/logs/nginx/search.abc.com.cn_access.log;
}
로그인 후 복사

위 구성 후 nginx가 시작된 후, 다른 도메인 이름에 액세스하여 다른 서버에 액세스하세요. 그리고 모두 2차 도메인 이름인 .abc.com.cn을 갖고 있기 때문입니다. 따라서 쿠키를 공유할 수 있습니다.

nginx 파일 구조는 다음과 같습니다.

nginx를 사용하여 쿠키 교차 도메인 액세스 문제를 해결하는 방법

3. 수정된 nginx 구성

주로 reverse-proxy.conf가 다릅니다

server
{
  listen 9998;
  server_name 192.168.0.1:9998;
  location /servlets/ {
    proxy_redirect off;
    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_pass http://192.168.0.1:8088;
  }
  location / {

    root  /usr/local/nginx/html/web/;
    index index.html index.htm;
  }
  location ~ \.(jsp|do)?$ {
    proxy_redirect off;
    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_pass http://192.168.0.1:8088;
    
    proxy_http_version 1.1;
    proxy_set_header upgrade $http_upgrade;
    proxy_set_header connection "upgrade";
    proxy_read_timeout  700s;
  } 
if ($http_user_agent ~* "qihoobot|baiduspider|googlebot|googlebot-mobile|googlebot-image|mediapartners-google|adsbot-google|feedfetcher-google|yahoo! slurp|yahoo! slurp china|youdaobot|sosospider|sogou spider|sogou web spider|msnbot|ia_archiver|tomato bot") { 
        return 403; 
    }
  access_log /usr/local/nginx/logs/www.abc.com.cn_access.log;
}

server
{
  listen 9994;
  server_name 192.168.0.1:9994;
  location / {
   proxy_redirect off;

    root  /usr/local/nginx/html/weixin/;
    index index.html index.htm;
  }
  location ~ \.(jsp|do)?$ {
    proxy_redirect off;
    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_pass http://localhost:8084;
  }
  if ($http_user_agent ~* "qihoobot|baiduspider|googlebot|googlebot-mobile|googlebot-image|mediapartners-google|adsbot-google|feedfetcher-google|yahoo! slurp|yahoo! slurp china|youdaobot|sosospider|sogou spider|sogou web spider|msnbot|ia_archiver|tomato bot") { 
        return 403; 
    }
  access_log /usr/local/nginx/logs/m.abc.com.cn_access.log;
}
 
server
{
  listen 9990;
  server_name store.abc.com.cn *.store.abc.com.cn;
  location / {
    proxy_redirect off;
    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_pass http://localhost:8081;
  }
  access_log /usr/local/nginx/logs/store.abc.com.cn_access.log;
}

server
{
  listen 9992;
  server_name 192.168.0.1:9992;
  location / {
    proxy_redirect off;
    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_pass http://192.168.0.2:8082;
  }
  access_log /usr/local/nginx/logs/shopcenter.abc.com.cn_access.log;
}
 
server
{
  listen 9993;
  server_name 192.168.0.1:9993;
  location / {
    proxy_redirect off;
    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_pass http://192.168.0.3:8083;
  }
  access_log /usr/local/nginx/logs/search.abc.com.cn_access.log;
}
로그인 후 복사

이런 식으로 192.168.0.1:9998을 단일 포인트 서버로 사용할 수 있으며 로그인 다음 도메인은 모두 192.168.0.1입니다. 나머지 0.2와 0.3은 192.168.0.1nginx라는 서로 다른 포트와 단일 지점 서버를 통해 접근이 가능하므로 0.1이라는 도메인 이름을 공유할 수 있다.

위 내용은 nginx를 사용하여 쿠키 교차 도메인 액세스 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿