2014-10-06 9 views
21

मैं क्लाउडफ्लेयर प्रॉक्सी के पीछे एक वेबसाइट होस्ट कर रहा हूं, जिसका अर्थ है कि मेरे सर्वर के सभी अनुरोध पोर्ट 80 से अधिक हैं, भले ही क्लाउडफ्लारे HTTP (पोर्ट 80) और HTTPS (पोर्ट 443) यातायात को संभालता है।शीर्षलेख के मान के आधार पर nginx रीडायरेक्ट कैसे करें?

दोनों के बीच अंतर करने के लिए, क्लाउडफ्लारे में X-Forwarded-Proto हेडर शामिल है जो उपयोगकर्ता के कनेक्शन के आधार पर "http" या "https" पर सेट है।

मैं प्रत्येक अनुरोध को X-Forwarded-Proto: http शीर्षलेख के साथ अपनी साइट के SSL संस्करण में रीडायरेक्ट करना चाहता हूं। मैं इसे nginx कॉन्फ़िगरेशन के साथ कैसे प्राप्त कर सकता हूं?

+0

बस एक त्वरित ध्यान दें कि क्लाउडफ्लेयर आपकी साइट की सामग्री होस्ट नहीं करता है। नोट: पेजर्यूल ने यहां भी काम किया होगा, क्योंकि ऐसा लगता है कि आप http: // से https: // को आगे बढ़ाने की कोशिश कर रहे हैं। पेजर्यूल के बारे में जानकारी: https://support.cloudflare.com/hc/en-us/articles/200168306-Is-here-a- ट्यूटोरियल-for- पेज- नियम- – damoncloudflare

उत्तर

30

ऐसा करने का सबसे आसान तरीका if निर्देश के साथ है। यदि कोई बेहतर तरीका है, तो कृपया मुझे बताएं, क्योंकि लोग कहते हैं कि if निर्देश अक्षम है। Nginx डैश को हेडर में अंडरस्कोर में परिवर्तित करता है, इसलिए X-Forwarded-Proto$http_x_forwarded_proto बन जाता है।

server { 
    listen 80; 
    server_name example.com; # Replace this with your own hostname 
    if ($http_x_forwarded_proto = "http") { 
     return 301 https://example.com$request_uri; 
    } 

    # Rest of configuration goes here... 
} 
+2

सुनिश्चित नहीं है कि आप किस बात से बात करते हैं, लेकिन यदि है अक्षम नहीं पुन: लिखने के दायरे के बाहर उद्देश्यों के लिए दुर्व्यवहार किया गया है जब यह त्रुटि प्रवण है। अगर इसकी कमियों को समझने के लिए बुरा लेख है तो पढ़ें। आपका समाधान वह है जिसे इसे डिजाइन किया गया था, इसलिए इसे ठीक काम करना चाहिए। – Melvyn

+8

बस एक छोटा सा नोट: यदि आपके पास एकाधिक सर्वर_नाम मान हैं, तो अधिक सामान्य संस्करण के साथ रिटर्न स्ट्रिंग को प्रतिस्थापित करना बेहतर है: वापसी 301 https: // $ host $ request_uri; – Alekc

0

कोशिश का उपयोग कर नक्शा निर्देश: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

कुछ इस तरह ...

map $http_x_forwarded_proto  $php_backend { 
    "https"   "https_php_backend named loc"; 
    default  "default_php_backend named loc"; 
} 
server{ 
    location/{ 
     proxy_pass http://$php_backend; 
    } 
} 

इस कोड सार है, लेकिन आप tht तरह से कोशिश कर सकते हैं ...

संबंधित मुद्दे

 संबंधित मुद्दे