Я получил 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-эквивалент?
Ответы:
Вот и все...
источник
$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
Таким образом, ваша правильная конфигурация будет
Это, вероятно, позволит вам правильно перенаправить на ваш домен ssl с использованием группового блока сервера. Вы также можете попробовать использовать универсальное имя сервера подчеркивания '_' или $ host, как предложено в комментарии выше. Дайте нам знать!
источник
return
в целом лучше, предлагаемая конфигурация неверна, так как она все еще использует $ server_name для перенаправления, которое будет «* .mydomain.com». Правильное исправление уже было отмечено @cjc в комментарии выше - его$host
следует использовать вместо$server_name
.return 301 https://$host$request_uri;
return 301 https://$server_name$request_uri;
чтобы заставить их использовать https на порт 443. Проблема в том, что перенаправленный URL все еще имеет исходный номер порта. 80 не проблема, но 8080 выходит какhttps://example.com:8080
Попробуйте что-то вроде этого:
Задача состоит в том, чтобы определить подстановочный сервер и выполнить перенаправления на основе его имени.
источник