Nginx : 한 경로에는 SSL을, 다른 경로에는 SSL을 사용하지 않습니다.


27

내 사이트의 경로 중 하나에서만 SSL을 사용하고 나머지는 모두 SSL이 아닌 Nginx conf 파일을 어떻게 설정합니까?

예를 들어, / user 아래의 모든 URL은 https이지만 나머지 URL은 http가 되길 원합니다.

첫 번째 부분은 다음과 같습니다.

rewrite ^/user(.*) https://$http_host$request_uri?;

"if"를 사용하고 싶지 않습니다. 나는 그것이 작동 순서를 이용한다고 가정하지만 루프에서 끝내고 싶지 않습니다.

답변:


38

nginx 구성에는 두 개의 "서버"영역이 있어야합니다. 하나는 포트 80, 다른 하나는 포트 443 (비 SSL 및 SSL)입니다. 비 SSL 웹 사이트에서 위치를 추가하면 SSL 페이지로 리디렉션됩니다.

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

/ user로 끝나는 모든 트래픽을 https : // 서버로 전달합니다.

그런 다음 443 서버에서 반대의 작업을 수행합니다.

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
    location /user {
    }
}

2
이 방법은 훌륭하지만 몇 가지 일반적인 함정 , 특히 "루트 내부 위치 블록"및 "세금 재 작성"
kolbyjack

1
편집했습니다. 괜찮습니까? 또한 80을 듣고 http_host를 추가했습니다.
pbreitenbach

이 구성을 사용하면 사용자가 사이트의 페이지를 탐색 할 때 연결이 ssl / non-ssl로 전환되고 시작된 URL의 경우 ssl이, /user다른 모든 URL의 경우 비 ssl이됩니다. 결과적으로 사용자 https://www.example.com/가 브라우저의 주소 표시 줄에 명시 적으로 입력하더라도 결과 페이지는 http://www.example.com/입니다. 이 답변에 설명 된 설정에 따라 ssl / non-ssl 사이에 자동 URL 재 작성을 구현하는 방법이 있지만 주소 표시 줄에 사용자가 명시 적으로 입력 한 경우 명시 적 ssl 요청을 여전히 준수합니까? 감사!
goodbyeera 2016 년

@ 굿바이 예 사용자가 특정 영역에서 SSL을 사용하도록 강요하려는 경우 443 서버 구성에서 다시 쓰기 명령을 제거하여 프로토콜을 무시하고 다른 곳에서는 사용할 수 있습니다. 물론 이제 보안 부분으로 이동하면 다른 곳으로 갈 때에도 SSL을 사용하여 탐색하지만 사람들이 SSL을 사용하도록 선택할 수 있습니다.
척 건조

13

Nginx를 사용하면 동일한 server블록 내에서 HTTP와 HTTPS를 모두 처리 할 수 ​​있습니다 . 따라서 둘 다에 대한 지시문을 복제 할 필요가 없으며 보안하려는 경로를 리디렉션 할 수 있습니다

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

수 있는지 확인 하지 넣어 ssl on은 일반 HTTP를 깰 것이기 때문에이 선을.

선택적으로 동일한 방식으로 HTTPS의 다른 모든 요청을 HTTP로 다시 리디렉션 할 수 있습니다.

if ($scheme = 'https') {
  rewrite ^ http://$http_host$request_uri? permanent;
}

업데이트 : Alexey Ten은 주석 섹션에서 친절하게 지적했듯이 scheme각 요청을 확인 하는 것은 그리 좋은 생각이 아닙니다. nginx를 구성하는 선언적인 방법을 따라야합니다. 이 경우로 리디렉션 된 두 개의 서버 블록을 선언하고 location공통 논리를 별도의 파일로 이동 include시키십시오. 따라서 GruffTech의 답변이 더 좋습니다.


2
모든 요청에 ​​대해 nginx 검사 체계를 만드는 것은 효과적이지 않습니다.
Alexey Ten

1
나는 3 년 전에 그 질문에 대한 답을 알고 있었지만 점진적으로하는 일을하기 위해 고군분투하면서 내 발걸음을 따르는 사람들과 결과를 나누고 싶었다.
Hnatt


1
@AlexeyTen은 "if를 사용하는 것을 피할 수 없을 때"가 아닌가? 지시문을 복제하지 않고 HTTP 및 HTTPS에 대해 동일한 구성을 갖는 다른 방법이 있습니까?
Hnatt

2
include공통 지시문에 지시문을 사용하십시오 . 일부 중복은 괜찮습니다.
Alexey Ten
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.