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

20

Я получил 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-эквивалент?

что-что
источник
2
Вместо $ server_name, почему не $ host?
Cjc

Ответы:

47

Вот и все...

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

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
cadmi
источник
2
Немного больше объяснений может сделать это лучшим ответом.
Дэйв М,
3
@ Дэйв-м, что там нужно объяснять? $hostпеременная? $request_uri?
Кадми
Это не работает, все еще получил https: //%2A.handy.travel/
Дэймон Юань
2

Официальная документация 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, как предложено в комментарии выше. Дайте нам знать!

Апурва Сукант
источник
Хотя использование returnв целом лучше, предлагаемая конфигурация неверна, так как она все еще использует $ server_name для перенаправления, которое будет «* .mydomain.com». Правильное исправление уже было отмечено @cjc в комментарии выше - его $hostследует использовать вместо $server_name.
Максим Дунин
Да согласился. Ах, кажется, мое внимание привлекает!
Апурва Сукант
Вместо вышеизложенного, позвольте мне предложить вам совет с вашей конфигурацией ssl, который должен значительно улучшить производительность. Наиболее эффективный способ настроить SSL, если вы используете подстановочный сертификат, - это установить «сшивание ssl». Это позволяет вам настроить SSL один раз на вашем сервере по умолчанию для всех поддоменов и сохранить отдельную проверку подлинности ssl для каждого поддомена. ssl_stapling on; резольвер 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Referencerence- calomel.org/nginx.html
Апурва Сукант
2
Должно бытьreturn 301 https://$host$request_uri;
scarver2
Я слушаю порты 80, 8080 и 8181, return 301 https://$server_name$request_uri;чтобы заставить их использовать https на порт 443. Проблема в том, что перенаправленный URL все еще имеет исходный номер порта. 80 не проблема, но 8080 выходит какhttps://example.com:8080
A.Grandt
-1

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

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

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

Андрей Михальцов
источник
Чрезмерно допустимая группа регулярных выражений.
Kzqai