2012-09-06 22 views
5

के साथ express.js सत्र मैंने api.mydomain.com को localhost:2000 पर आगे बढ़ाने के लिए अपाचे रिवर्स प्रॉक्सी सेट अप किया है जो ठीक काम करता है।रिवर्स प्रॉक्सी

हालांकि, मेरे पास वास्तविक समस्या सत्रों के संबंध में है - ऐसा लगता है कि api.mydomain.com के माध्यम से पूछताछ करते समय req.session को संग्रहीत नहीं किया जा रहा है। सत्र localhost:2000 से बस बढ़िया काम करेंगे।

मुझे लगता है इस प्रॉक्सी डोमेन के साथ क्या करना कुछ है ...

server.js

var express = require('express'), 
    app = express(); 

app.enable('trust proxy'); 

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret: 'supersecret'}); 
    app.use(app.router); 
}); 

app.get('/session', function(req, res, next){ 
    console.log(req.session.username) 
    // this will be undefined when called from api.mydomain.com... 
}); 


app.post('/session', function(req, res, next){ 
    req.session.username = 'my username'; 
}); 

अपाचे config

<VirtualHost *:80> 
    ServerName api.mydomain.com 
    ProxyPass/http://localhost:2000/ 
    ProxyPassReverse/http://localhost:2000/ 

    ProxyPreserveHost On 
    ProxyPassReverseCookieDomain api.domain.com localhost:2000 
    ProxyPassReverseCookiePath// 
</VirtualHost> 

संपादित

विशेष रूप से, आगे परीक्षण के लिए - नीचे दिए गए कोड को जोड़ना app.configure() में app.use(app.router) ....

app.use(function (req, res) { 
    res.send('<h2>Hello, your session id is ' + req.sessionID + '</h2>'); 
}); 

निम्नलिखित में परिणाम होगा (प्रत्येक पंक्ति ऐप्लिकेशन में एक नई प्राप्त/सत्र अनुरोध का प्रतिनिधित्व करता है - नोड या तो पुनः प्रारंभ नहीं हुआ)।

स्थानीय होस्ट: 2000

Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq 
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq 
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq 

api.mydomain.com

Hello, your session id is uuo4U5ierZAG8LSH1BdwTlVf 
Hello, your session id is 8BxL97Bo35SDt4uliuPgnbia 
Hello, your session id is 0xkqZZpzQNvTsQpbJtUlXgkR 

सेटअप जानकारी

NodeJS v0.8.8

अपाचे v2.4.2

ExpressJS v3.0.0rc4

अद्यतन 2

ठीक है, मैं अब तक सरल उपयोग mydomain.com/api को सुलझा लेने के रूप में है कि सब कुछ ठीक करने के लिए लगता है। तो मुझे लगता है कि अपाचे ने एक्सप्रेस के साथ डोमेन संचार को कैसे संभाला है, यह सिर्फ कुछ है!

+0

विशेष रूप से, मैं यहाँ config का उपयोग कर nginx के साथ सटीक एक ही बात करने की कोशिश की - http://blog.argteam.com/coding/hardening-node-js-for-production-part-2 -using-nginx-to-escape-node-js-load/लेकिन एसएसएल के बिना और ऊपर जैसा ही मुद्दा उत्पन्न किया। एसएसएल सत्रों के लिए एक आवश्यकता है? – crawf

+0

आपकी समस्या को दोहराने की कोशिश करते समय मुझे एक ही समस्या आई है - जब तक कि मैंने अपनी ब्राउज़र कुकीज़ साफ़ नहीं की। क्या आप सत्यापित कर सकते हैं कि आपकी कुकी साफ़ करने के बाद समस्या बनी रहती है? अनुरोध के लिए आप किस ब्राउज़र/HTTP क्लाइंट का उपयोग कर रहे हैं? क्रोम और फ़ायरफ़ॉक्स का उपयोग करते हुए – zzen

+0

@zzen। जब भी ये चीजें होती हैं, तो मैंने अपने कैश को साफ़ करना सुनिश्चित कर लिया है, लेकिन मदद नहीं की प्रतीत होती है। विशेष रूप से, मुझे एक उप डोमेन (उदाहरण के लिए api.domain.com की बजाय domain.com/api) की बजाय निर्देशिका पर रनइन करते समय रिवर्स प्रॉक्सी मिल गया है, जो मुझे लगता है कि यह पूरी तरह से डोमेन हैंडलिंग के साथ एक मुद्दा है एक्सप्रेस .. – crawf

उत्तर

3

Apache ProxyPass and Sessions द्वारा निर्णय यह अपाचे कॉन्फ़िगरेशन शायद ...

<VirtualHost *:80> 
    ServerName api.mydomain.com 
    ProxyPass/http://localhost:2000/ 
    ProxyPassReverse/http://localhost:2000/ 
    ProxyPassReverseCookiePath// 
</VirtualHost> 
+0

एक और बढ़िया विचार है कि सबसे अधिक काम करना चाहिए, लेकिन फिर, नहीं! मैंने कई अन्य विकल्प 'प्रॉक्सीडोमेन api.mydomain.com',' प्रॉक्सीप्रेशर्वहोस्ट ऑन ',' प्रॉक्सी रिव्यू ऑन ऑन ',' प्रॉक्सीविया ऑन ',' प्रॉक्सीपास रिवरसेक्यूडीडोमेन// 'लेकिन कुछ भी सुधारने की प्रतीत नहीं की है ... – crawf

4

server.js को ExpressJS एपीआई डॉक्स से

app.enable('trust proxy'); 

उद्धरण निम्नलिखित जोड़ें: http://expressjs.com/api.html#app-settings ...

विश्वास प्रॉक्सी - रिवर्स प्रॉक्सी समर्थन, डिफ़ॉल्ट रूप से अक्षम को सक्षम करता

+0

अच्छा विचार, मैं वास्तव में इस पर आया था। हालांकि, यह काम नहीं लग रहा है। मैंने 'proxy: true' को' app.use (express.session(); 'को जोड़ने के लिए भी जोड़ा है। – crawf

1

सत्र कुकी को अग्रेषित करने के लिए यह छोटा होना चाहिए और देखें कि आपका ब्राउज़र प्रॉक्सी किए जाने पर इसे फिर से क्यों नहीं भेजता है - डोमेन या पथ संभवतः गलत है।

पुन: आपकी बाद की टिप्पणियां - हो सकता है कि आपने वास्तव में तर्क के रूप में डोमेन का उपयोग करने के बजाय "प्रॉक्सीपास रिवरसेकुकीडोमेन//" सेट किया हो?

प्रॉक्सीप्रेशर्वहोस्ट शायद अप्रत्यक्ष रूप से आपके लिए भी काम करेगा, लेकिन कुकी को ठीक करना बेहतर है।

+0

मैंने प्रॉक्सीपास रिवरसेक्यूकीडोमेन सेट करने का प्रयास किया है वास्तविक यूआरएल के साथ, लेकिन कुछ भी ठीक नहीं लग रहा था। जैसा कि आप कहते हैं, ProxyPreserveHost के पास आसान है (वास्तव में मेरे पास एक और समस्या ठीक करता है)। मैंने दोनों डोमेन पर अनुरोधों की तुलना की है, और api.domain से प्रतिक्रिया शीर्षलेख .com में हमेशा एक सेट-कुकी हेडर होता है, जबकि लोकलहोस्ट: 2000 में केवल एक बार प्रारंभिक अनुरोध पर होता है ... – crawf

+0

या तो यूआरएल नहीं, डोमेन नाम। – covener

+0

संपादित प्रश्न देखें – crawf

1

इस कॉन्फ़िगरेशन का उपयोग नोड 0.6.17, एक्सप्रेस 3.0.0rc4 पर मेरी सत्र आईडी को बनाए रखता है। प्रारंभ में मेरे पास वर्चुअलहोस्ट में निम्न था, लेकिन आपकी कॉन्फ़िगरेशन से मेल खाने के बाद भी, यह अभी भी काम करता है।

ServerName api 
ServerAlias api.internal.local 

मुझे एक सेट-कुकी कनेक्ट.sid मिलता है जिसे बनाए रखा जाता है।

+0

अपाचे संस्करण httpd-2.2.3 – Brett

+0

मुझे आशा है कि यह इतना आसान होगा - लेकिन जो मैं कह सकता हूं, केवल एक ही अंतर अपाचे संस्करण है! मैं इस समय संस्करणों को आसानी से स्विच नहीं कर सकता, लेकिन अगर यह कुछ भी बदल गया तो मुझे आश्चर्य होगा ... – crawf

-1

यह हमारे साथ हुआ कि मुझे नहीं लगता कि रिवर्स कुकीज़ सामान ने हमारी स्थिति में मदद करने के लिए कुछ भी किया है।

मैंने कोशिश की: app.use ("ट्रस्ट प्रॉक्सी");

कोई फायदा नहीं हुआ।

तथापि का उपयोग कर

app.use("trust proxy"); 
app.set("trust proxy", 1); 

काम करता है।

आशा है कि यह प्रॉक्सी कुकी मुद्दों वाले किसी को भी मदद करेगा।

+0

यह शायद आपके ऐप को तोड़ देगा। ऐप उपयोग के लिए एक मिडलवेयर फ़ंक्शन की आवश्यकता होती है। –

0

मैंने इस सटीक मुद्दे का अनुभव किया और सफलता के बिना यहां वर्णित सभी चीजों का प्रयास किया।

RequestHeader set X-Forwarded-Proto "https"

यह विशेष रूप से मणि मैं https://github.com/expressjs/session/issues/251

में पिछले टिप्पणियों में से एक में खोज की तो कुल मिलाकर बातें मैं करने के लिए लागू: पहेली के अंतिम टुकड़ा अपाचे का SSL वर्चुअल होस्ट config के लिए निम्नलिखित जोड़ने था इस प्रकार यह थे ठीक:

  1. अपाचे कॉन्फ़िग में परिवर्तन:

RequestHeader set X-Forwarded-Proto "https" ProxyPassReverseCookiePath//

  1. नोड ऐप में परिवर्तन।

app.enable('trust proxy');

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