Nginx: SSL को एक पथ पर, दूसरों पर गैर-एसएसएल को बल दें


27

मैं अपनी साइट में केवल एक पथ पर एसएसएल और बाकी सभी पर गैर-एसएसएल को बाध्य करने के लिए नगनेक्स फ़ाइल कैसे सेट कर सकता हूं?

उदाहरण के लिए, मैं चाहता हूं कि सभी URL के तहत / उपयोगकर्ता का https हो, लेकिन शेष सभी URL http का हो।

मेरे पास पहले भाग के लिए:

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

मैं "अगर" का उपयोग नहीं करना चाहता। मुझे लगता है कि यह ऑपरेशन के आदेश का लाभ उठाएगा लेकिन मैं एक लूप में समाप्त नहीं होना चाहता।

जवाबों:


38

आपके nginx कॉन्फ़िगरेशन में, आपके पास दो "सर्वर" क्षेत्र होने चाहिए। पोर्ट 80 के लिए एक, और पोर्ट 443 (नॉन-एसएसएल और एसएसएल) के लिए एक। बस अपने एसएसएल पेज पर पुनर्निर्देशित करने के लिए अपनी गैर-एसएसएल वेबसाइट में एक स्थान जोड़ें।

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

यह सभी ट्रैफ़िक को अग्रेषित करेगा जो आपके https: // सर्वर पर / उपयोगकर्ता को समाप्त होता है।

फिर, अपने 443 सर्वर में, आप इसके विपरीत करते हैं।

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

2
यह दृष्टिकोण अच्छा है, लेकिन यह आम नुकसान की एक जोड़ी में आता है , विशेष रूप से "रूट इन लोकेशन ब्लॉक" और "टैक्सिंग
रीराइट्स

1
मैंने संपादित किया। क्या यह ठीक लग रहा है? मैंने भी 80 की सुन ली और http_host को जोड़ा।
pbreitenbach

इस कॉन्फ़िगरेशन के साथ, कनेक्शन से / ssl / गैर- ssl पर स्विच करता है जब कोई उपयोगकर्ता साइट पर पृष्ठों को नेविगेट करता है, url के लिए ssl के साथ शुरू हुआ /userऔर अन्य सभी यूआरएल के लिए गैर-एसएसएल। परिणामस्वरूप, यहां तक ​​कि उपयोगकर्ता https://www.example.com/ब्राउज़र के एड्रेस बार में स्पष्ट रूप से टाइप करता है, जिसके परिणामस्वरूप पृष्ठ है http://www.example.com/। क्या इस उत्तर में वर्णित सेटिंग्स द्वारा प्राप्त ssl / गैर-ssl के बीच ऑटो-url-rewrite को लागू करने का एक तरीका है, लेकिन फिर भी स्पष्ट ssl अनुरोध का सम्मान करते हैं यदि यह पता बार में उपयोगकर्ता द्वारा स्पष्ट रूप से टाइप किया गया है? धन्यवाद!
अलविदा

@goodbyeera हाँ। यदि विचार उपयोगकर्ताओं को कुछ क्षेत्रों में एसएसएल का उपयोग करने के लिए मजबूर करने के लिए है, तो हम वहां उनके प्रोटोकॉल को ओवरराइड कर सकते हैं, लेकिन 443 सर्वर कॉन्फ़िगरेशन से रीराइट कमांड को हटाकर उन्हें हर जगह सम्मानित कर सकते हैं। बेशक, अब जब वे एक सुरक्षित हिस्से में जाते हैं, तो वे अभी भी एसएसएल के साथ ब्राउज़ करेंगे जब वे कहीं और जाएंगे, लेकिन यह लोगों को गेट से जाने के लिए एसएसएल का उपयोग करने की अनुमति देता है।
चक

13

Nginx HTTP और HTTPS दोनों को एक ही serverब्लॉक में प्रोसेस करने की अनुमति देता है । इस प्रकार आपको दोनों के लिए निर्देशों की नकल नहीं करनी है और आप जिस मार्ग को सुरक्षित करना चाहते हैं उसे पुनर्निर्देशित कर सकते हैं

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

अद्यतन : जैसा कि अलेक्सई टेन कृपया टिप्पणी अनुभाग में बताते हैं, schemeप्रत्येक अनुरोध पर जाँच करना बहुत उज्ज्वल विचार नहीं है। आपको अपने nginx को कॉन्फ़िगर करने के घोषित तरीके का पालन करना चाहिए। इस स्थिति में, दो सर्वर ब्लॉकों को पुनर्निर्देशित करके घोषित करें location, सामान्य तर्क को एक अलग फ़ाइल में ले जाएं और includeइसे दोनों में। तो GruffTech का जवाब बेहतर है।


2
हर अनुरोध के लिए नगनेक्स चेक योजना बनाना अप्रभावी है।
एलेक्सी टेन

1
मुझे पता है कि इस सवाल का जवाब 3 साल पहले दिया गया था, लेकिन मैंने इसे वह करने के लिए संघर्ष करते हुए पाया जो मैंने धीरे-धीरे किया और बस अपने परिणामों को उन लोगों के साथ साझा करना चाहता था जो मेरे कदमों का अनुसरण करेंगे।
हन्नट


1
@AlexeyTen यह मामला नहीं है "जब आप एक का उपयोग करने से बच नहीं सकते हैं"? क्या कोई दूसरा तरीका है HTTP और HTTPS के लिए एक ही कॉन्फ़िगरेशन बिना निर्देशों को दोहराए?
हन्नत

2
includeसामान्य निर्देशों के लिए निर्देश का उपयोग करें । कुछ दोहराव ठीक है।
एलेक्सी टेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.