перенаправлення піддоменів підстановки на https (nginx)


20

У мене є сертифікат wildcard 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;
}

2
Трохи більше пояснень може зробити це кращою відповіддю.
— Дейв М

3
@ Дейв-м, що там потрібно пояснити? $hostзмінна? $request_uri?
— cadmi

Це не працює, все одно отримали https: //%2A.handy.travel/
— Деймон Юань

2

Офіційна документація NGINX рекомендує використовувати директиву повернення замість використання директиви перезапису для здійснення перенаправлення. Це так, оскільки перезапис запиту не призначений для цього сервера, але він все одно обробляється в цьому блоці сервера. Тож переадресації правильно робляться замість директиви повернення, оскільки вся обробка зупиняється і відповідь надсилається негайно. 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, з блоком серверів підстановки. Ви також можете спробувати загальне підкреслити ім'я сервера '_' або $ хост, як було запропоновано у коментарі вище. Повідомте нас!


Хоча використання, returnяк правило, краще, пропонована конфігурація не є правильною, оскільки вона все ще використовує $ server_name для перенаправлення, яке буде "* .mydomain.com". Правильне виправлення вже було окреслено @cjc у коментарі вище - його $hostслід використовувати замість $server_name.
— Максим Дунін

Так, погоджено. А, здається, мої уваги розмиваються!
— Апурва Сукант

Замість детрактування вище, дозвольте запропонувати вам підказку зі своєю конфігурацією ssl, яка повинна значно підвищити продуктивність. Найефективніший спосіб налаштування SSL, якщо ви використовуєте сертифікат wildcard, - це налаштування зшивання ssl. Це дозволяє вам встановити SSL один раз на вашому сервері за замовчуванням для всіх піддоменів і зберігає окрему аутентифікацію ssl для кожного піддомену. ssl_stapling on; резолюція 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Refference- calomel.org/nginx.html
— Apurva Sukant

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.