次のようなクラウド設定があります。
User Request -> Perlbal (SSL unwrapping) -> Squid (Caching) -> Apache -> HTTP Response
SSL をサポートするページとサポートしないページがあります。perlbal は SSL をラップ解除するため、perlbal 層を超えるものはすべて、暗号化されていない HTTP 経由のリクエストのみを処理しますX-Forwarded-Proto
が、SSL が使用されているかどうかをアプリケーションが認識できるようにヘッダーを追加します。
要求が HTTP 経由でアプリケーション (Apache) にヒットした場合、その特定のページで SSL が必要な場合、HTTPS にリダイレクトされます。
安全なリソースのリクエストがアプリケーションに到達し、アプリケーションが を送信するCache-Control: public
と、squid はそのコンテンツを正しくキャッシュします。問題は、ユーザーがキャッシュされたリソースの HTTP バージョンにアクセスしようとすると、squid はそれをキャッシュ HIT として処理し、HTTP 経由でキャッシュされたリソースを返します。 -Forwarded-Proto が元のリクエストと一致しません。
これはどのように行われますか?私たちのアプリケーションは以下を送信します:
Vary: X-Forwarded-Proto,Accept-Encoding
これに関する記事やドキュメントを見つけるのに苦労しています。この Vary ヘッダーは他の人が提案しているようですが、機能していません。Squid は、X-Forwarded-Proto ヘッダーが SSL を示しているかどうかに関係なく、キャッシュされたコンテンツを提供します。