2016-11-18 5 views
1

サブドメインに複数のサイトがあり、nginxを使用してサービスを提供しようとしていますが、サブドメインの中にはSSLでサービスされているものもあれば、そうでないものもあります。私は非SSLサイトを適切に提供するのにいくつかの問題を抱えています。私はそれらにアクセスしようとすると、すぐに(正しいホストで)SSL/HTTPSバージョンにリダイレクトします。私は下の場所ブロックを添付しました。私はリクエスト処理でnginxブロックを読みましたが、暗号化されていないホストに転送されないように強制する方法を理解することはできません。 (http://nginx.org/en/docs/http/request_processing.htmlNginxサーバーブロック注文

server { 
    listen 80; 
    server_name dev.example.ca dev.example.server2.example.tl; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example/example/socket.sock; 
    } 
    location /static { 
     autoindex on; 
     alias /home/litobro/example/example/static/; 
    } 
} 

server { 
    listen 80; 
    server_name dutyroster.example.ca; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example2/dutyroster/socket.sock; 
    } 
    location /static { 
     autoindex on; 
     alias /home/example/example2/static/; 
    } 

    location /socket.io { 
     proxy_pass http://unix:/home/example/example2/socket.sock; 
     proxy_redirect off; 
     proxy_buffering off; 

     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "Upgrade"; 
    } 
} 

server { 
    listen 80; 
    server_name ex3.server2.example.tl example.ca www.example.ca; 

    location ~ .well-known/acme-challenge/ { 
     root /var/www/letsencrypt; 
     default_type text/plain; 
    } 

    return 301 https://$host$request_uri; 
} 

server { 
    listen 443 ssl http2; 
    server_name example.ca www.example.ca example.server2.example.tl; 

    ssl_certificate /etc/letsencrypt/live/example.ca/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.ca/privkey.pem; 
    include snippets/ssl-params.conf; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example/example3/socket.sock; 
    } 
} 

私は、ポート80件のリクエストがうまくいけば、最初のヒットになるだろうというようなサーバ・ブロックを注文したが、これはまだ機能していないようです。助けを前にありがとう! (ドメインブロックが一貫しているとは思うが、サーバブロックはほとんどが実際のドメインを取り除かれている)

+0

それでした!私は自分のssl-paramsにサブドメインを入れました。本当にありがとう!それを解決策として提出することができますので、これを解決したことを示すことができますか? – Litobro

答えて

0

この問題の原因はHSTSヘッダーで、これはsnippets/ssl-params.confに設定されています。このヘッダーは、WebサイトがHTTPS経由でのみ接続されることをブラウザに通知します。ここで、このヘッダはnginxのが設定されている方法の例である:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;"; 

ヘッダ値は上記の例のように、includeSubDomainsフラグが含まれている場合、HSTSポリシーがメインドメインのすべてのサブドメインに適用されます。これが、ブラウザがHTTPS経由でサブドメインにすべてのリクエストを送信しようとした理由です。

現代のブラウザでは、HSTS Webサイトのリストが特別なキャッシュに保存されるため、Nginxでヘッダーを削除または変更するだけではすぐには効果がありません。ブラウザ固有の方法でHSTSキャッシュを手動で消去する必要があります。

includeSubDomainsフラグを使用すると、good practiceと見なされるので、それを保持してサブドメインの証明書を発行することをお勧めします。現在、Let's Encryptのようないくつかの証明機関があり、無料で証明書をインストールすることができます。

0

申し訳ありませんが、nginxの経験はあまりありませんが、 confファイル。最初にポート80を聞いて、 "return 301 https:// $ host $ request_uri;"このラインは必要ですか?

その行にコメントして、非SSLサーバー名がまだhttpsにリダイレクトされているかどうか確認してください。

+0

私はいくつかのホストに強制的にsslを強制するためにそれを使用していますが、その行を取り除くと、それらのホストはもはや強制されませんが、他のホストもsslなしで動作します。それは何らかの理由で他のホストよりも優先されており、私はなぜそれがわかりません。 – Litobro