nginx의 기본 URL이 https로 다시 작성되는 경우

nginx의 기본 URL이 https로 다시 작성되는 경우

내 기본 도메인인 www.domain.com만 다시 작성하고 싶습니다.https://www.domain.com 기본적으로 내 https 블록에서는 ~uri = "/"(기본 도메인) 또는 정적 콘텐츠가 아닌 경우 http://로 다시 라우팅합니다.

server {
  listen              443;
  set $ssltoggle 2;
  if ($uri ~ ^/(img|js|css|static)/) {
      set $ssltoggle 1;
  }
  if ($uri = '/') {
      set $ssltoggle 1;
  }
  if ($ssltoggle != 1) {
      rewrite ^(.*)$ http://$server_name$1 permanent;
  }
}

따라서 내 http 블록에서 https가 필요한 경우 다시 작성해야 합니다.

server {
  listen              80;
  if ($uri = '/') {
      set $ssltoggle 1;
  }
  if ($ssltoggle = 1) {
      rewrite ^(.*)$ https://$server_name$1 permanent;
  }
}

http 블록에 $uri = '/' if 문이 없으면 https로 직접 이동하면 제대로 작동하지만 예상되는 일반 http로 이동하면 리디렉션되지 않습니다. 해당 내용을 http 블록에 넣으면 몇 분 내에 모든 작동이 중지됩니다. 몇 가지 요청에 대해서는 작동할 수 있지만 항상 1분 정도 내에 중지됩니다. 브라우저에서는 모든 요청에 ​​대해 빈 페이지가 표시됩니다. nginx를 다시 시작하면 https 및 http 블록 모두에서 if 문 블록을 모두 제거하고 nginx를 다시 시작할 때까지 계속 작동하지 않습니다. 오류 로그를 보면 기록된 내용이 없습니다. 액세스 로그를 보면 다음 메시지가 표시됩니다.

"-" 400 0 "-" "-"

나는 400 오류를 의미한다고 가정합니다. 왜 이것이 나에게 효과가 없는지 이해가 되지 않습니다. 내 최종 목표는 기본 도메인을 https 전용으로 설정하고 다른 모든 페이지는 기본적으로 http로 설정하는 것입니다. 어떻게 이를 달성할 수 있나요?

답변1

리디렉션 루프 없이 인수를 처리할 수 있도록 $uri를 $request_uri로 변경했습니다.

server {
  listen              443;
  set $ssltoggle 2;
  if ($uri ~ ^/(img|js|css|static)/) {
      set $ssltoggle 1;
  }
  if ($request_uri = '/') {
      set $ssltoggle 1;
  }
  if ($ssltoggle != 1) {
      rewrite ^(.*)$ http://$server_name$1 permanent;
  }
}

그런 다음 위치가 =/인 경우 즉시 다시 작성하도록 http 블록을 변경했습니다.

server {
  listen              80;
  location = / {
      rewrite ^(.*)$ https://$server_name$1 permanent;
  }
  if ($ssltoggle = 1) {
      rewrite ^(.*)$ https://$server_name$1 permanent;
  }
}

다른 재작성을 처리하기 위한 IF 문이 아직 있고 그 아래에서 모든 특정 서비스가 수행됩니다. Christopher가 제안한 대로 또는 원래 질문에 제시한 방식으로 모든 것을 처리하려고 할 때 리디렉션 루프와 오류가 발생하는 것은 아마도 내 특정 구성일 것입니다.

답변2

모든 if 문이 필요하지 않습니다. 위치 설명을 사용하여 작업해야 합니다.

server {
    listen              80;
    #rewrite base (/) to ssl
    location = / {
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }

    #serve anything else
    location / {
        [serve non-ssl page ...]
    }
}

server {
    listen              443;

    #serve base url
    location = / {
        [serve ssl page ...]
    }

    #serve assets
    location ~ ^/(img|js|css|static)/ {
        [serve ssl assets ...]
    }

    #rewrite anything else
    location / {
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }
}

이것은 테스트되지 않았으며 오류가 발생할 수 있지만 작동해야 합니다.

관련 정보