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

перенаправить поддомены с подстановочными знаками на https (nginx)

У меня есть сертификат ssl с подстановочными знаками, и я пытаюсь перенаправить весь трафик, отличный от ssl, на ssl. В настоящее время я использую следующее для перенаправления URL-адреса без поддоменов, который работает нормально.

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

когда я делаю то же самое для * .mydomain.com, он логически перенаправляется на

https://%2A.mydomain.com/

Как вы перенаправляете все поддомены на их https-эквивалент?

Вот и все...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}

Официальная документация NGINX рекомендует использовать директиву return вместо директивы rewrite для выполнения перенаправления. Это так, поскольку перезаписываемый запрос не предназначен для этого сервера, но он все равно обрабатывается в этом блоке сервера. Таким образом, перенаправления правильно выполняются с помощью директивы return, поскольку вся обработка останавливается, и немедленно отправляется ответ. NGINX не рекомендует перезаписывать для перенаправления здесь: http://nginx.org/en/docs/http/converting_rewrite_rules.html

Синтаксис директивы возврата: URL кода возврата; Поскольку вы изначально выполняли постоянную перезапись, соответственно, вы можете использовать 301 в качестве кода для ответа, указывая, что это постоянное перенаправление. Ваш https-адрес будет передан в разделе URL. Ссылка: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Итак, ваша правильная конфигурация будет

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

Это, вероятно, позволит вам правильно перенаправить на ваш домен ssl с блокировкой сервера с подстановочными знаками. Вы также можете попробовать использовать подчеркивание для общего имени сервера '_' или $ host, как это предлагается в комментарии выше. Дайте нам знать!

Попробуйте что-то вроде этого:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

Уловка состоит в том, чтобы определить сервер с подстановочными знаками и выполнять перенаправления на основе его имени.