nginxでプロキシを使用するときにSSIを表示する際の問題
ssiを使用して動的ブロックを表示することにしました。 ローカルマシンではすべて正常に機能しましたが、ssiサーバーへのアップロード後にブロックは処理されませんでした。
プロキシWebサーバーとして、Apacheが使用されます。 一連の実験の後、fastcgiを使用すると、ssiブロックが完全に処理されることがわかりました。 つまり、問題はApacheプロキシサーバーにあります。
彼は、ローカルマシンおよびサーバー上のApacheヘッダーの分析を開始しました。
$curl -I http://apache_host:port
興味深い見出しに気づいた
Vary: Accept-Encoding
ここで説明を見つけました。 つまり、ヘッダーを送信して圧縮を設定できます。
$curl -I -H 'Accept-Encoding: gzip,deflate' http://apache_host:port ... Content-Encoding: gzip ...
つまり、プロキシサーバーはコンテンツを圧縮形式で提供し、nginxはssi命令を解析できませんでした。
Apacheでの圧縮には、mod_deflateが責任を負います。 これはすべて、このモジュールを無効にすることで処理できます。
$a2dismod deflate Module deflate disabled. Run '/etc/init.d/apache2 restart' to activate new configuration! $/etc/init.d/apache2 restart
言語キャッシュ分離の設定
私が設定したサイトでは、言語はCookieを使用して設定されています。つまり、一意のURLはありません(これは既にSEO用です:))。
異なる言語のキャッシュを分割するために、キーを使用しました:
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri|$lang";
最後のパラメーター$ langに注意してください。 それをインストールするには、ngx_http_map_moduleを使用しました。
map $http_accept_language $browser_lang { default en; ~ru ru; ~da da; ~de de; } map $cookie_name_of_language_cookie $lang { default $browser_lang; ~en en; ~de de; ~ru ru; ~da da; } server { ........... }
最初のディレクティブはブラウザの言語を定義し、言語Cookieがない場合はデフォルトで2番目に使用されます。 modはhttpコンテキストに追加する必要があることに注意してください。私の場合は、サーバーの前に追加しました。
これで、ユーザーが知らない言語のページをキャッシュから受け取らないことが保証されます。