Nginx හි SSL වෙත බල කිරීම හෝ හරවා යැවීම කරන්නේ කෙසේද?


224

මට උප ඩොමේනයක ලියාපදිංචි වීමේ පිටුවක් ඇත: https://signup.example.com

එය ප්‍රවේශ විය යුත්තේ HTTPS හරහා පමණක් වන නමුත් මිනිසුන් කෙසේ හෝ HTTP හරහා පැකිලී 404 ක් ලබා ගනී යැයි මම බිය වෙමි.

Nginx හි මගේ html / server block එක මේ වගේ ය:

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නමුත් එය වළක්වා ගැනීමට බලාපොරොත්තු විය)


Answers:


145

Nginx අන්තරායන්ට අනුව , අනවශ්‍ය ලෙස අල්ලා ගැනීම අතහැර දැමීම තරමක් හොඳය, $request_uriඒ වෙනුවට භාවිතා කිරීම. එවැනි අවස්ථාවකදී, කිසියම් විමසුම් තර්ක දෙගුණ කිරීමෙන් nginx වැළැක්වීම සඳහා ප්‍රශ්නාර්ථ ලකුණක් එකතු කරන්න.

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

70
නැතහොත්, ඔබ සම්බන්ධ කළ වෙබ් අඩවියට අනුව, “වඩා හොඳ” :return 301 http://domain.com$request_uri;
nh2

13
එක් අදහසක්. server server_name the පළමු සේවාදායක_විශේෂ විචල්‍යය ලබා ගනී. එබැවින් ඔබේ වින්‍යාසය තුළ FQN නොවන නම් තිබේ නම් මේ පිළිබඳව සැලකිලිමත් වන්න
ඉංජිනේරු

2
h nh2 මෙය return 301...නැවත ලිවීමේ ක්‍රමය සත්‍ය වශයෙන්ම ක්‍රියාත්මක වන අතර “නැවත හරවා යැවීම්” දෝෂයක් ඇතිවීම නිසා ලියකියවිලි වැරදියි .
මයික් බෙතානි

1
එය දැන් "ද BAD" ලෙස ලේඛනගත කර ඇත. @MikeBethany return 301(මම අනුමාන) ඔයා තමයි එය කලේ ය මිස, වැඩ කරන්නේ . නිවැරදි URL ලිපින සඳහා, වරාය, නාවික, ගුවන් දෙකම (config උදාහරණයක් මත සවන් දීමෙන් ප්රශ්නය ඇති කලේ ය: ගනිත් serverfault.com/a/474345/29689's පළමු පිළිතුර හා පළමුෙවන් නම්, ).
බ්ලයිසෝර්බ්ලේඩ්

1
වසර ගණනාවක් තිස්සේ වෙනස් වී ඇති දේ සහ මෙම අනෙක් පිළිතුර වඩා හොඳ දැයි මම කල්පනා කරමි: serverfault.com/a/337893/119666
රයන්

262

විධානය භාවිතා කරමින් නිල ආකාරය කෙසේ ද යන්න විස්තර කර ඇති හොඳම ක්‍රමය return:

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

6
කෙටිම පිළිතුර සහ මගේ නඩුවේ පරිපූර්ණව වැඩ කළා
mateusz.fiolka

1
මෙය සාමාන්‍යයෙන් නිර්දේශ කරනුයේ එය 301 Moved Permanentlyඔබගේ (ඔබගේ සබැඳි ස්ථිරවම චලනය වී ඇති) මෙන්ම නැවත ලිවීම නිසා ය
sgb

1
ඔබ සකසා තිබුණද එය "නැවත හරවා යැවීම්" දෝෂයක් ඇති බැවින් මෙය ක්‍රියා නොකරයිproxy_set_header X-Forwarded-Proto https;
මයික් බෙතානි

1
Ike මයික් බෙතානි ඔබ listen 443;එකම කොටසක නිර්වචනය කරනවාද?
ජෝ බී

3
මෙය පිළිගත් පිළිතුර විය යුතුය.
sjas

123

ඔබට මේ සියල්ල එක සේවාදායක කොටසක තබා ගැනීමට අවශ්‍ය නම් මෙය නිවැරදි හා කාර්යක්ෂම ක්‍රමයයි:

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;
    }
}

ඉහත සියල්ල, "නැවත ලිවීම" හෝ "නම් ssl_protocol" යනාදිය භාවිතා කිරීම මන්දගාමී හා නරක ය.

මෙන්න එකම, නමුත් ඊටත් වඩා කාර්යක්ෂම වන්නේ, http ප්‍රොටෝකෝලය මත නැවත ලිවීම පමණක් ක්‍රියාත්මක කිරීමෙන් සෑම ඉල්ලීමකටම $ යෝජනා ක්‍රම විචල්‍යය පරීක්ෂා කිරීමෙන් වැළකී සිටීමයි. නමුත් බැරෑරුම් ලෙස, එය එතරම් සුළු දෙයක් වන අතර ඒවා වෙන් කිරීමට ඔබට අවශ්‍ය නොවේ.

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;
}

8
නියමයි, සමහර බියගුල්ලෝ මෙම පිළිතුර නිවැරදි වුවත්, එයට හේතුව නොකියමින් ඡන්දය ප්‍රකාශ කළහ. සමහර විට “නපුරු නම්” සංස්කෘතිකයන්ගෙන් තවත් කෙනෙක් විය හැකිය. If පිළිබඳ Nginx ප්‍රලේඛනය කියවීමට ඔබ කරදර වන්නේ නම්, IfIsNOTEvil, CERTAIN විසින් එය ස්ථානයක}} සන්දර්භය තුළ භාවිතා කරන බව ඔබ දැන ගනු ඇත, ඒ කිසිවක් අප මෙහි නොකරයි. මගේ පිළිතුර නම් නියත වශයෙන්ම නිවැරදි දේ කිරීමයි!
DELETEDACC

2
මම මෙය ඡන්දය ප්‍රකාශ කළේ නැත, නමුත් නවතම අනුවාද වල පෙරනිමිය 'default_server' ලෙස වෙනස් කර ඇති බව පෙන්වා දීමට කැමැත්තෙමි.
spuder

පළමු විසඳුම වඩාත් කාර්යක්ෂම විය නොහැක, දෙවැන්න ඊටත් වඩා කාර්යක්ෂම නම්. ඔබ එහි තිබේ නම් භාවිතා නොකළ යුත්තේ මන්දැයි ඔබ විස්තර කර ඇත: "සෑම ඉල්ලීමකටම $ යෝජනා ක්‍රම විචල්‍යය පරීක්ෂා කිරීමෙන් එය වළක්වයි". Ifs භාවිතා නොකිරීමේ කාරණය කාර්ය සාධනය ගැන පමණක් නොව, ප්‍රකාශිත වීම සහ අත්‍යවශ්‍ය නොවේ.
pepkin88

1
+1 සඳහා නම් ($ scheme = http)
ප්‍රනාන්දු කොෂ්

අනෙක් පිළිතුරු වල සඳහන් පරිදි මෙහි $ ධාරකය භාවිතා කළ යුතුය.
ආටෙම් රුසකොව්ස්කි

56

ඔබ නව ද්විත්ව 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;

ප්‍රතික්ගේ නැවත ලිවීමේ රේඛාව සමඟ.


2
Av ඩේවිඩ් පැෂ්ලි ඔබේ විසඳුම මට ආශ්වාදයක් මෙන් ක්‍රියා කළේය. ස්තූතියි
ජයෂ් ගෝපාලන්

1
If you are using the new dual HTTP and HTTPS server definitionඑවිට ඔබ එය වෙන් කළ යුතුය.
VBart

2
අලංකාර සහ පරිපූර්ණ වැඩ!
ජැක්ට්‍රේඩ්

2
මගේ Laravel / Homestead Nginx වින්‍යාසය සමඟ මට වැඩ කළ එකම විසඳුම මෙයයි.
ජැරඩ් එට්නියර්

1
නැවත ලිවීමේ රේඛාව විය යුත්තේ return 301 https://$server_name$request_uri;මෙය වඩාත් කැමති ක්‍රමය වන බැවිනි.
ජැරඩ් එට්නියර්

27

ධාරකය ආරක්ෂා කරන තවත් ප්‍රභේදයක්: ඉල්ලීම් ශීර්ෂය සහ nginx අන්තරායන් පිළිබඳ "හොඳ" උදාහරණය අනුගමනය කරයි :

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

Note that using $server_name instead of $host would always redirect to https://site1එය කුමක් $request_uriසඳහා ද?
ජර්ගන් පෝල්

2
$request_uriධාරක හෝ ඩොමේන් නාමයක් අඩංගු නොවේ. වෙනත් වචන වලින් කිවහොත්, එය සෑම විටම "/" අක්ෂරයකින් ආරම්භ වේ.
පීටර්

2
මෙතෙක් හොඳම පිළිතුර.
ආශේ

3
මෙම පිළිතුර ඡන්ද ප්‍රමාණය අඩු වන්නේ මන්දැයි මට විශ්වාස නැත. එය භාවිතා කිරීම වටී.
zopieux

2
බොහෝ අය $ server_name භාවිතා කරන බව විශ්වාස කළ නොහැක මෙය කළ හැකි නිවැරදි ක්‍රමය මෙයයි
ග්‍රෙග් එනිස්

1
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 සේවාව නැවත ආරම්භ කිරීමට අමතක නොකරන්න.


rewrite ^ https://$host$request_uri? permanent; ඔබට සේවාදායක නාම කිහිපයක් වොස්ට් එකක තිබිය හැකි බැවින් වඩා හොඳ විසඳුමක් වනු ඇත

0

මම හිතන්නේ මෙය වඩාත් සරල විසඳුමයි. HTTPS නොවන සහ WWW නොවන ගමනාගමනය HTTPS සහ www සඳහා පමණක් බල කරයි.

server {
    listen 80;
    listen 443 ssl;

    server_name domain.tld www.domain.tld;

    # global HTTP handler
    if ($scheme = http) {
        return 301 https://www.domain.tld$request_uri;
    }

    # global non-WWW HTTPS handler
    if ($http_host = domain.tld) {
        return 303 https://www.domain.tld$request_uri;
    }
}

සංස්කරණය කරන්න - අප්‍රේල් 2018: විසඳුම w / o IF ගේ මගේ ලිපියෙන් මෙතැනින් සොයාගත හැකිය: https://stackoverflow.com/a/36777526/6076984


1
කොන්දේසි nginx ලෝකයේ නපුරක් හා අකාර්යක්ෂමතාවයක් ලෙස සලකන්නේ නැද්ද?
පී.කේ.හන්ටර්

ඔව්, ඔවුන් පොදුවේ. නමුත් මෙම සරල චෙක්පත් සඳහා මම අනුමාන නොකරමි. මා සතුව නිසි වින්‍යාස ගොනුවක් ඇත, එය වැඩි කේත ලිවීමකට සම්බන්ධ වන නමුත් IF සම්පූර්ණයෙන්ම මග හැරේ.
stamster

: Google 301 වෙනුවට 303. මූලාශ්රය භාවිතා කිරීමට උපදෙස් දෙයි support.google.com/webmasters/answer/6073543?hl=en
dylanh724

YdylanHunt - මම පරීක්‍ෂා කිරීම සඳහා 303 ක් පමණක් තැබුවෙමි, 1 වන හසුරුවන්නා 301 ට සකසා ඇති බව සලකන්න, 2 වන ස්ථානය පමණක් වෙනස් කිරීමට මට අමතක විය :) එසේම, විසඳුම w / o IF ගේ: stackoverflow.com/a/36777526/6076984
stamster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.