2012-04-25 5 views
2

これは、ここ数時間私を怒らせてしまった。それは、PHP/Apache/Pound/Haproxy(実際には伝えられない)のように、以前と同じスキーム/ドメインにページをリダイレクトしようとしているように思えます。"header:location"オーバーライドスキームに対するPHP/Apacheの呼び出し?

背景:通常、http:\\ www.example.comドメインはhttps:\\ secure.example.comセキュアドメインに結合されています(異なるサブドメインに注意してください)。これは私たちがすべての開発者/プロジェクトにSSL証明書を持っていないので簡単に開発でき、URLが「安全」で始まるかどうかを確認するだけです。このプロジェクトでは、クライアントは安全なドメインとしてhttps:\\ www.example.comを望んでいるので、問題はありません。その部分は正常に動作しています。

ただし、場合によっては、ユーザーを安全な状態から安全でない状態にリダイレクトする必要があります。ログインしてホームページにリダイレクトされたときに表示されます。私はこの単純なテストケースにそれを絞り込むました(注:セキュリティで保護さと非安全な公開ディレクトリは、単にお互いにシンボリックリンクです):あなたはそれがhttpsを呼び出した後に一度リダイレクトを期待したい

<?php 

// this is our server-specific way of detecting secure/non-secure in production 
if (isset($_SERVER['HTTP_X_SSL_CIPHER'])) { 
     header("HTTP/1.1 Moved permanently", true, 301); 
     header("Location: http://www.example.com/test.php"); 
} 
echo 'bubbles!'; 

:\ \ www.example.com/test.phpを開き、 "bubbles!"をエコーし​​ます。しかし、私のブラウザはhttpS:\\ www.example.com/test.phpへのリダイレクトを主張し、無限ループを引き起こします。

HTTPメタリフレッシュまたはJavaScriptリダイレクトでヘッダー呼び出しを置き換えると、すべて正常に動作しますが、実際には場所ヘッダーを使用する必要があります。 Apache/PHP/Pound/Haproxyは、私が明示的にそうしないと言っていても、私は安全なドメインに固執すべきだと自分自身で判断しているようです。

その他の興味深い点は、逆(リバースから非セキュアからセキュアへ)がうまく機能しているように見えることです。また、https:\\ secure.example.comスキームを使用する他のサイト(同じサーバー上)では、おそらくサブドメインが異なるため、すべて正常に動作しています。

なぜこのようなことが起こっているのか、何が原因なのでしょうか?私たちのサーバー設定は次の通りです:Poundはポート8080で隠されたWebサーバーにhttps要求を配信し、ポート80(およびIMAPのような他のもの)で非セキュアにするためにhaproxyを実行します。

私が考えることができるのは、ロードバランサが何かを混乱させているということだけですが、Webサーバーからの返信がクライアントのAFAICTに直接送信されるため意味がありません。 ?

N.B.例の中のスラッシュをバックスラッシュに置き換えた、あるいは、私が "あまりにも多くのリンク"を投稿していると思った。それらはリンクではなく、サンプルドメインです。私がリンクを掲示したいと思えば、私はアンカーを加えただろう。

+0

あなたのパケットスニファは言う...? –

+0

これは、サーバーレベルでリダイレクトが変更されていることを示しています。この問題は、おそらくPHPやApache、および/または私たちの設定に関係している可能性が高いです。クライアントは、https >> httpでなければならないと明言していますが、単にhttps >> httpsリダイレクトを受信します。申し訳ありませんが、おそらくOPでより明確になっているはずです。 – Marijn

答えて

0

見つけました。ポンドは、ドメイン名が一致した場合(この場合は元の位置)に、「最初に要求されたもの」に任意の場所ヘッダーを書き換えることをデフォルトにしています。 ListenHTTPSセクションの「RewriteLocation 0 | 1 | 2」を参照してください。私の場合は0に設定する必要があります( "do not do this")。

関連する問題