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