다음과 같은 하위 도메인에 가입 페이지가 있습니다. 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 서비스를 다시 시작하는 것을 잊지 마십시오.