2012-09-06 8 views
5

api.mydomain.comlocalhost:2000に転送するためにApacheリバースプロキシを設定しましたが、うまく動作します。express.jsリバースプロキシセッション

しかし、実際の問題はセッションに関することです。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'; 
}); 

Apacheの設定

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

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

EDIT

注目すべきは、さらなるテストのために - 前に以下のコードを追加するapp.use(app.router)app.configure()で....

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

は、以下になります(各ラインのアプリケーションへの新しいGET /セッション要求 - を表すノードは、いずれかの再起動していません)。

はlocalhost: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

のApache v2.4.2

それがすべてを解決するようで、同様

ExpressJS v3.0.0rc4

UPDATE 2

は、私がこれまでのところ、簡単な使用mydomain.com/apiに解決しました。ですから、それはApacheがExpressとのドメイン通信をどのように処理するかとだけ関係していると思います!

+0

注目すべきは、私はここで設定を使用してnginxのとまったく同じことを試してみました - http://blog.argteam.com/coding/hardening-node-js-for-production-part-2 -using-nginx-to-avoid-node-js-load /しかし、sslはなく、上記と同じ問題が発生しました。 SSLはセッションの要件ですか? – crawf

+0

私はブラウザクッキーをクリアするまで、問題を再現しようとしている間に同様の問題が発生しました。あなたはクッキーをクリアした後も問題が解決しないことを確認できますか?リクエストにどのブラウザ/ HTTPクライアントを使用していますか? ChromeとFirefoxを使用して@zzen – zzen

+0

私はこれらのことが起こるたびにキャッシュをクリアするようにしましたが、助けにはならなかったようです。注目すべきは、サブドメイン(例えば、api.domain.comではなくdomain.com/api)ではなく、ディレクトリ上で動くときにリバースプロキシが動作することです。 express ... – crawf

答えて

3
で無効になって、リバースプロキシのサポートを有効にします

判定:Apache ProxyPass and Sessionsこのapache config ...

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

もう一つの素晴らしいアイデアは、 'ProxyDomain api.mydomain.com'、 'ProxyPreserveHost On'、' ProxyRequests On'、 'ProxyVia On'、' ProxyPassReverseCookieDomain// 'を試してみましたが、何も改善していないようです... – crawf

4

ExpressJSのAPIのドキュメントから

app.enable('trust proxy'); 

引用server.jsに以下を追加します。http://expressjs.com/api.html#app-settings ...

信頼プロキシは - デフォルト

+0

良いアイデア、私は実際にこれを見てきました。しかし、それは動作していないようです。私はconnect.jsのドキュメントに従って 'app.use(express.session(); ')に 'proxy:true'を追加しました。 – crawf

1

転送されているセッションCookieを見て、プロキシしたときにブラウザが再送信しない理由を確認するのは簡単です。ドメインまたはパスが間違っている可能性があります。

Re:あなたの後のコメント - ドメインを引数として使うのではなく、実際には "ProxyPassReverseCookieDomain//"を設定したのでしょうか?

ProxyPreserveHostも間接的に動作しますが、クッキーを修正する方が良いでしょう。

+0

ProxyPassReverseCookieDomainを設定しようとしました(実際には別の問題を修正しています)。私は両方のドメインのリクエストとapi.domainのレスポンスヘッダーを比較しました。 .comには常にSet-Cookieヘッダーが含まれていますが、localhost:2000は最初のリクエストで一度しか使用されません。 – crawf

+0

ドメイン名もURLはありません – covener

+0

編集された質問を見る – crawf

1

この設定を使用すると、セッションIDはノード0.6.17、3.0.0rc4で維持されます。当初、私はvirtualhostで次のものを持っていましたが、あなたの設定に合うように変更しても、それはまだ動作します。

ServerName api 
ServerAlias api.internal.local 

私はset-cookie connect.sidを取得しています。

+0

Apacheのバージョンはhttpd-2.2.3 – Brett

+0

私はそれが簡単だろうと思っていましたが、私が知る限り、唯一の違いはApacheのバージョンです!現時点ではバージョンを簡単に切り替えることはできませんが、これが何か変更された場合、私はショックを受けます... – crawf

-1

私はこの逆のクッキーが私たちの状況を助けるために何かをしたとは思わないと私たちに起こりました。

私は試しました: app.use( "trust proxy");

をご利用いただけません。しかし

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

作品を使用して

これは、プロキシのCookieに関する問題が発生した場合に役立ちます。

+0

これはおそらくあなたのアプリを壊します。アプリの使用にはミドルウェア機能が必要です。 –

0

私はこの正確な問題を経験し、ここで言及したすべてのものを成功させることなく試しました。パズルの最後のピースは、ApacheのSSL仮想ホストの設定に以下を追加しました:

RequestHeader set X-Forwarded-Proto "https"

私は私が実装https://github.com/expressjs/session/issues/251

だから、全体的なもので、最後のコメントの一つで発見されたこの特定の宝石をApacheの設定へ

  1. 変更:
を次のようにして、それを修正10

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

  1. ノードアプリケーションの変更。

app.enable('trust proxy');