
내 기본 도메인인 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;
}
}
이것은 테스트되지 않았으며 오류가 발생할 수 있지만 작동해야 합니다.