Назад | Перейти на главную страницу

nginx перезаписывает только определенное имя сервера на https

Речь идет о двух поддоменах. Первый (www) должен быть доступен через http. Ко второму (облачному) нужно получить доступ по 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..
И есть ли актуальность в порядке записей сервера или это не имеет значения?


Использование nginx 0.8.54 в Ubuntu 11.04.

Представленный вами образец конфигурации выглядит правильно, и я сомневаюсь, что он будет работать так, как вы описываете (вы, вероятно, внесли слишком много изменений, пытаясь его упростить).

Вы неправильно перенаправляете что-то вроде 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 чтобы убедиться, что вы видите, что там есть.