nginx에서 SSL을 강제 실행하거나 리디렉션하는 방법은 무엇입니까? 사람들이 어떻게 든 HTTP를

다음과 같은 하위 도메인에 가입 페이지가 있습니다. https://signup.example.com

HTTPS를 통해서만 액세스 할 수 있어야하지만 사람들이 어떻게 든 HTTP를 통해 넘어져서 404를 얻을 수 있다고 걱정합니다.

nginx의 내 HTML / 서버 블록은 다음과 같습니다.

html {
  server {
    listen 443;
    server_name signup.example.com;

    ssl                        on;
    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    ssl_session_timeout 30m;

    location / {
      root /path/to/my/rails/app/public;
      index index.html;
        passenger_enabled on;
    }
  }
}

내가가는 사람들 http://signup.example.com이 리디렉션 되도록 무엇을 추가 할 수 https://signup.example.com있습니까? (FYI 나는 강제 할 수는 SSL있지만 그것을 피하기를 희망 하는 Rails 플러그인이 있다는 것을 알고 있습니다 )



답변

nginx 함정 에 따르면 $request_uri대신 불필요한 캡처를 생략하는 것이 좋습니다. 이 경우 nginx가 쿼리 인수를 두 배로 늘리지 않도록 물음표를 추가하십시오.

server {
    listen      80;
    server_name signup.mysite.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

답변

공식 사용 방법 에서 설명한 가장 좋은 방법 은 return지시문 을 사용하는 것입니다 .

server {
    listen      80;
    server_name signup.mysite.com;
    return 301 https://$server_name$request_uri;
}

답변

하나의 서버 블록에 모두 유지하려면이 방법이 정확하고 가장 효율적인 방법입니다.

server {
    listen   80;
    listen   [::]:80;
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
}

“rewrite”또는 “if ssl_protocol”등을 사용하는 위의 모든 것은 느리고 더 나쁩니다.

http 프로토콜에서 다시 쓰기 만 실행하면 모든 요청에서 $ scheme 변수를 확인하지 않아도됩니다. 그러나 진지하게, 그것들을 분리 할 필요가없는 사소한 일입니다.

server {
    listen   80;
    listen   [::]:80;

    server_name www.example.com;

    return 301 https://$server_name$request_uri;
}
server {
    listen   443 default_server ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;
}

답변

새로운 이중 HTTP 및 HTTPS 서버 정의를 사용하는 경우 다음을 사용할 수 있습니다.

server {
    listen   80;
    listen   [::]:80;
    listen   443 default ssl;

    server_name www.example.com;

    ssl_certificate        /path/to/my/cert;
    ssl_certificate_key  /path/to/my/key;

    if ($ssl_protocol = "") {
       rewrite ^   https://$server_name$request_uri? permanent;
    }
}

이것은 저에게 효과적이며 리디렉션 루프를 유발하지 않습니다.

편집하다:

교체 :

rewrite ^/(.*) https://$server_name/$1 permanent;

Pratik의 다시 쓰기 줄로.


답변

Host : request 헤더를 유지하고 nginx 함정 에 대한 “GOOD”예제를 따르는 또 다른 변형 :

server {
    listen   10.0.0.134:80 default_server;

    server_name  site1;
    server_name  site2;
    server_name  10.0.0.134;

    return 301 https://$host$request_uri;
}

결과는 다음과 같습니다. $server_name대신에 를 사용 $host하면 항상로 리디렉션됩니다 https://site1.

# curl -Is http://site1/ | grep Location
Location: https://site1/

# curl -Is http://site2/ | grep Location
Location: https://site2/


# curl -Is http://site1/foo/bar | grep Location
Location: https://site1/foo/bar

# curl -Is http://site1/foo/bar?baz=qux | grep Location
Location: https://site1/foo/bar?baz=qux

답변

쿠키에 ‘보안’을 설정했는지 확인하십시오. 그렇지 않으면 쿠키가 HTTP 요청으로 전송되고 Firesheep와 같은 도구로 잡을 수 있습니다.


답변

server {
    listen x.x.x.x:80;

    server_name domain.tld;
    server_name www.domian.tld;
    server_name ipv4.domain.tld;

    rewrite     ^   https://$server_name$request_uri? permanent;
}

생각보다 잘 작동합니다. xxxx는 서버의 IP를 나타냅니다. Plesk 12를 사용하는 경우 “/var/www/vhosts/system/domain.tld/conf”디렉토리의 “nginx.conf”파일을 원하는 도메인으로 변경하면됩니다. 구성을 저장 한 후 nginx 서비스를 다시 시작하는 것을 잊지 마십시오.