2013-07-03 5 views
11

का कॉन्वेन्स अपाचे तो मेरे पास एसएसएल ऑफ़लोडिंग और HTTP लोड बैलेंसर का उपयोग करने वाला अपेक्षाकृत सीधे आगे सर्वर स्टैक है। सेटअप इस तरह कुछ दिखता है:मूल क्लाइंट प्रोटोकॉल

(client) -> (SSL offload - stud) -> (balancer - haproxy) -> (http server - apache) 

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

समस्या कुछ हद तक सार है। मैं एक प्रदर्शन के साथ शुरू करूंगा। ग्राहक https://myserver.tld/scp करने के लिए सेटअप के माध्यम से एक अनुरोध (कुछ बातें स्पष्ट रखने के लिए हटा दिया हेडर)

GET /scp HTTP/1.1 
Host: myserver.tld 
(headers added by haproxy) 
X-Forwarded-For: [original::client:ip] 
X-Forwarded-Proto: https 

बनाता है और सर्वर

HTTP/1.1 301 Moved Permanently 
Date: Wed, 03 Jul 2013 03:16:25 GMT 
Server: Apache/2.2.15 (CentOS) 
Location: http://myserver.tld/scp/ 
Content-Length: 344 
Content-Type: text/html; charset=iso-8859-1 

तो अपाचे mod_dir के साथ एक ही यूआरएल के लिए एक रीडायरेक्ट भेज रहा है के साथ प्रतिक्रिया एक पिछला स्लैश। ऐसा करना उचित है। यह मुद्दा नहीं है। मुद्दा यह है कि HTTPS प्रोटोकॉल खो गया था। दोबारा, मुझे लगता है कि अपाचे एक HTTP यूआरएल पर रीडायरेक्ट करने के लिए सही है, आखिरकार, उपर्युक्त स्टैक से प्राप्त कनेक्शन एक नियमित HTTP कनेक्शन है।

तो अपाचे के परिप्रेक्ष्य से, ग्राहक ने नियमित HTTP कनेक्शन का अनुरोध किया। एचटीटीपीएस ध्वज अन्य सभी एसएसएल जानकारी के साथ बंद है, क्योंकि सत्र के एसएसएल भाग को स्टड द्वारा नियंत्रित किया जाता है।

हालांकि (अपाचे के अंदर) मैं एक वैध X-Forwarded-Proto हैडर है, मैं अपाचे बताने के लिए एक तरीका है कि मूल ग्राहक कनेक्शन HTTPS था और निर्देशिका स्लेश mod_dir से अनुप्रेषित कि https:// प्रोटोकॉल का उपयोग करना चाहिए नहीं मिल रहा। मैं क्या खो रहा हूँ?

केवल एक चीज मैं ले कर आए हैं HTTPS अग्रेषित कनेक्शन के लिए haproxy अंदर Location हैडर https:// साथ http:// को बदलने के लिए पुनर्लेखन के लिए है, लेकिन मैं सच में नहीं लगता है कि दृष्टिकोण बहुत ही सुंदर है। मैं Apache (और (मुझे) को चोट नहीं पहुंचाएगा) पीएचपी आगे श्रृंखला को सूचित करता है) एक सामान्य HTTPS कनेक्शन जैसे कनेक्शन को सूचित और इलाज के लिए।

कृपया मदद करें!

पीएस - मैंने यह पूछने से पहले कहा है कि क्या आपको पूछना है, तो आप इसे गलत कर रहे हैं। शायद यह जड़ मुद्दा है, लेकिन ऐसा लगता है कि यह एक साधारण दुविधा है और मुझे लगता है कि यहां आने वाला एकमात्र ऐसा ही है।

उत्तर

8
  1. निर्देशिका स्लैश रीडायरेक्ट: आप क्या चाहते हैं mod_rewrite

    RewriteEngine On 
    RewriteCond %{HTTP:X-Forwarded-Proto} =https 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^(.+[^/])$   https://www.example.com/$1/ [R=301,L,QSA] 
    

    हैडर https पर सेट है और अनुरोध किया फ़ाइल नाम एक निर्देशिका (-d) है, तो फिर से लिखने कि (अपने खुद के डोमेन के साथ example.com बदलें)।

    SetEnvIf X-Forwarded-Proto https HTTPS=on 
    
+0

# 2 मेरे लिए बहुत अच्छा काम करता है। धन्यवाद – jontro

+0

मुझे अपने उपयोग के लिए ठीक से काम करने के लिए सुझाव 1 समायोजित करना पड़ा। पहले, मैं करने के लिए दूसरा RewriteCond बंद: 'RewriteCond% {ला-यू: REQUEST_FILENAME} -d' ठीक से काम कर मिलान (पर [अपाचे के डॉक्स] (http आधारित पाने के लिए: //httpd.apache। संगठन/डॉक्स/वर्तमान/mod/mod_rewrite.html), विशेष रूप से "यूआरएल-आधारित लुक-आगे" के बारे में नोट। मैंने मेजबाननाम को गतिशील रूप से शामिल करने के लिए खुद को फिर से लिखना समायोजित किया, और डुप्लिकेट '/' से बचें: 'रिवाइट्रूल^(। + [^ /]) $ Https: //% {HTTP_HOST} $ 1/[आर = 301, एल, क्यूएसए]' '$ 1' var स्वयं प्रारंभिक स्लैश प्रदान करता है, इसलिए इसकी आवश्यकता नहीं है पुनर्लेखन यूआरएल में –

+0

रिवाइटऑप्शन स्वीकृति NooSlash को apache 2.4 के साथ जरूरी है। –

10

आप सर्वर नाम निर्देश में प्रोटोकॉल को शामिल करके ऐसा कर सकते हैं:

  • पीएचपी एक सामान्य HTTPS कनेक्शन की तरह कनेक्शन का इलाज करने के लिए के रूप में, वातावरण चर HTTPSon करने के लिए सेट

    ServerName https://my-server-name 
    

    अपाचे docs के अनुसार:

    कभी-कभी, सर्वर किसी ऐसे डिवाइस के पीछे चलता है जो SSL को संसाधित करता है, जैसे रिवर्स प्रॉक्सी, लोड बैलेंसर या SSL ऑफ़लोड उपकरण। जब ऐसा होता है, तो https: // योजना और पोर्ट नंबर निर्दिष्ट करें जिसमें क्लाइंट सर्वरनाम निर्देश में कनेक्ट होता है यह सुनिश्चित करने के लिए कि सर्वर सही स्व-संदर्भित यूआरएल उत्पन्न करता है।

  • +0

    यह काम नहीं करता है यदि आप उस एप्लिकेशन में एकाधिक प्रविष्टि बिंदु चाहते हैं जहां कोई https: // है और दूसरा http: // है। mod_dir * हमेशा * सर्वरनाम निर्देश में निर्दिष्ट योजना का उपयोग करेगा। ऐसी स्थितियां हैं जहां उत्पादन URL में https: // होगा लेकिन आंतरिक यूआरएल (परीक्षण के लिए, आदि) में http हो सकता है, खासकर एसएसएल/टीएलएस ऑफ़लोडिंग स्थितियों में जहां आप सीधे अपाचे उदाहरणों का परीक्षण/निगरानी करना चाहते हैं। अब इससे कोई फर्क नहीं पड़ता कि 'गैर-कैननिकल' यूआरएल सही तरीके से रीडायरेक्ट उत्पन्न नहीं करता है, लेकिन यह गन्दा है:/ – Tom17

    +0

    @ टॉम 17 उस स्थिति में, आप http और https साइटों के लिए अलग वर्चुअलहोस्ट बना सकते हैं, सिवाय इसके कि समान सेटिंग्स बंदरगाह और सर्वर नाम के लिए। –

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