Nginx-Удалить WWW из HTTPS
Я хотел бы попросить некоторую помощь со следующей конфигурацией Nginx, чтобы такие URL, как https://www.mywebsite.com
переписать как https://mywebsite.com
, В настоящее время я использую следующую конфигурацию:
server {
server_name www.mywebsite.com;
return 301 $scheme://mywebsite.com$request_uri;
}
server {
listen 80;
server_name mywebsite.com;
# Some more settings...
}
server {
listen 443 ssl;
server_name mywebsite.com;
ssl_certificate path_to_ssl_certificate;
ssl_certificate_key path_to_ssl_certificate_key;
# Some more settings...
}
В случае, если это имеет значение, сертификат, который я использую, является подстановочным сертификатом SSL, который был самозаверяющим с помощью OpenSSL на самом сервере (Ubuntu 12.04). Что происходит то www.mywebsite.com
правильно перенаправляет на mywebsite.com
, но https://www.mywebsite.com
не перенаправляет на https://www.mywebsite.com
(т.е. www
все еще появляется при просмотре страницы в браузере). Что я могу делать не так?
2 ответа
Решением является фиксация первого блока сервера следующим образом:
server {
listen 80;
listen 443;
server_name www.mywebsite.com;
return 301 $scheme://mywebsite.com$request_uri;
}
Например, вы забыли перехватить соединения www.mywebsite.com через порт ssl, вот и все. Кстати, это лучший способ убрать www из названия сайта, хороший выбор.
Перенаправление происходит на виртуальном хосте, который прослушивает только порт 80. Чтобы перенаправить запросы, поступающие через SSL, вам нужен виртуальный хост, прослушивающий порт 443 с SSL. Если все ваши браузеры не поддерживают SNI, у вас может быть только один виртуальный хост SSL, и поэтому правило должно входить в существующий SSL server
блок.
if ($host = www.mywebsite.com) {
rewrite ^ https://mywebsite.com$request_uri? permanent;
}