перенаправлення піддоменів підстановки на 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.