Моя конфигурация:
server {
listen 80;
server_name mydomain.com;
rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}
server {
listen 80;
server_name www.mydomain.com;
return 301 https://www.mydomain.com$request_uri;
if ($host !~* ^(www.mydomain.com)$ ) {
return 444;
}
}
server {
listen 443;
server_name www.mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
...
}
какой работает:
mydomain.com
к www.mydomain.com
www.mydomain.com
к https://www.mydomain.com
какой не работает правильно:
https://mydomain.com
прямо в браузер перенаправление на www.mydomain.com
просто не происходит, но запрос передается на сервер приложений как https://mydomain.com
Какое решение для https://mydomain.com
проблема выше?
Используйте оператор if в блоке вашего сервера SSL, чтобы проверить хост:
server {
listen 443;
server_name www.mydomain.com mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
if ($host = 'mydomain.com' ) {
rewrite ^/(.*)$ https://www.mydomain.com/$1 permanent;
}
...
}
Я предпочитаю избегать, потому что если зло, также я предпочитаю использовать возврат вместо перезаписи, потому что для этого не нужно запускать механизм регулярных выражений.
server {
#default server that catches all undefined host names
listen 80 default_server;
return 444;
}
server {
#redirecting server for non-www ssl and non ssl domains
listen 80;
liste 443 ssl;
server_name mydomain.com;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
return 301 https://www.mydomain.com$request_uri$is_args$query_string;
}
server {
# redirecting server for www non ssl server
listen 80;
server_name www.mydomain.com;
return 301 https://mydomain.com$request_uri$is_args$query_string;
}
server {
# main server config
listen 443 ssl;
server_name www.mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
# remaining config...
}
Как я и подозревал, причина была в том, что порт 80 был пропущен, а порт 443 получен напрямую. Добавление следующего server
блок включил перенаправление:
server {
listen 443;
server_name mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}
Если кто-то знает лучшее или более элегантное решение, добавьте свой ответ.