web-dev-qa-db-ja.com

nginxは特定のサーバー名のみをhttpsに書き換えます

約2つのサブドメインです。最初のもの(www)はhttp経由でアクセスする必要があります。 2つ目(クラウド)にはhttps経由でアクセスする必要があります。

これらは私のエントリの関連部分です:

server {
        listen 80;
        server_name cloud.example.de;
        rewrite ^ https://$server_name$request_uri? permanent;  # enforce https
}

server {
        listen 443 ssl;
        server_name cloud.example.de;
        root /home/user/web/cloud;
}

server {
        listen 80;
        server_name www.example.de;
        root /home/user/web/cms;

        #etc.
}

http://cloud.example.de を呼び出すと、 https://cloud.example.de にリダイレクトされます。しかし、 http://www.example.de を呼び出すと、 https://www.example.de にもリダイレクトされます。 cloud.example.com、これはポート443で使用される唯一のサーバー名セットであるため。

www-サブドメインのアクセスログにエントリがありません。
phpPgAdminを指す別のサブドメインがあります。これは通常どおりアクセスできますが、書き直されることはありません。

server {
        listen 80;
        server_name pgsql.example.de;
        root /home/user/web/phppgadmin;

        #etc
}

何が欠けている? 書き換えは、サーバー名がcloud.example.deと一致する場合にのみ行う必要があります。
サーバーエントリの順序に関連性はありますか、それとも問題ではありませんか?


Ubuntu 11.04でnginx 0.8.54を使用しています。

2
32bitfloat

あなたが提供するサンプルの設定は適切に見えますが、私はあなたが説明するようにそれが機能することを疑っています(おそらくそれを簡素化しようとするときにあまりにも多くの変更を加えました)。

curlのようなもの、またはブラウザのみで間違ったリダイレクトを取得していますか? permanentがMozillaに永続的にキャッシュされる(たとえば、以前のnginx.confから)場合に対処しました。単一の301キャッシュエントリを無効にする方法はありません。よろしいですか?キャッシュの問題ではありませんか?

いずれの場合も、ifを使用してリダイレクトを条件付きにすることもできます(おそらく、最初のサーバーがデフォルトサーバーとして選択されます)。

    if ($Host = "cloud.example.de") {
            rewrite ^ https://$server_name$request_uri? redirect;
    }
    return 403;

または、別のオプション、

server {
    listen 80;
    listen 443 ssl;
    server_name cloud.example.de;
    if ($scheme != "https") {
        rewrite ^ https://$server_name$request_uri? redirect;
    }
    root /home/user/web/cloud;
}

そして、curl -vを試して、そこに何があるかを確認してください。

9
cnst