Вопрос: Перенаправление http://example.com:12345 на https://example.com:12345 в nginx


Я знаю, что на это, должно быть, уже был дан ответ, но я искал довольно долгое время и не могу найти ответ. Просто не глядя в нужное место, я думаю, может быть, кто-то может мне помочь.

В основном я запускаю phpmyadmin через SSL на нестандартном порту, в этом примере 12345.

Теперь у меня есть https://example.com:12345 настроен нормально, он работает и все такое. Теперь я хочу добавить возможность просто ввести http://example.com:12345 и перенаправляться на https: //.

Я предположил, что следующее будет работать, но это не так.

server {
  listen        12345;
  server_name   php.myadmin.com;

  if ( $scheme = http ) {
    rewrite ^ https://php.myadmin.com:12345$request_uri? redirect;
  }
  root         /var/www/php;

  ssl           on;

  [....]
}

Это дает мне 400 bad request,

Теперь перед отправкой ответа обязательно просмотрите форму перенаправления. Проверьте ловушку в нижней части ссылки.

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

Кроме того, было бы неплохо, если бы это можно было сделать без if-утверждения:

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#using-if


4
2017-12-07 20:25


Источник




Ответы:


Я делаю именно это. gWaldo является правильным, но вы не хотите обслуживать контент через HTTP, просто перенаправление. Фокус в том, чтобы поймать ошибку http-on-https-port и использовать это, чтобы отсканировать клиента в нужное место.

server {
    listen   12345;
    server_name  my.domain.com;

    ssl on;
    ssl_certificate /etc/ssl/certs/your.pem;
    ssl_certificate_key /etc/ssl/private/your.key;

    # If they come here using HTTP, bounce them to the correct scheme
    error_page 497 https://$server_name:$server_port$request_uri;
    # Or if you're on the default port 443, then this should work too
    # error_page 497 https://$server_name$request_uri;

    location / {
        # Your config here...
    }
}

16
2018-04-16 15:32



Это фактический ответ на поставленный выше вопрос. Думаю, оп просто сдался и подумал, что он пытается сделать что-то невозможное. - jchysk
Пользователь StackOverflow отмечает: «Вероятно, вы хотите $ server_name вместо $ host, а имя_сервера, по-видимому, установлено в CN, что сертификат SSL аутентифицируется. Таким образом, пользователь не получит пугающий экран, если они вошли через IP или localhost «. (Из stackoverflow.com/questions/8768946/...) - Blaisorblade
@Blaisorblade Отвечено обновлено. - theJPster
Использование этого скрипта работает, но по какой-либо причине URL-адрес показывает порт теперь в браузере (так в основном www.example.com:80), так или иначе, чтобы он не показывал порт? - Fadi
В моем случае я был на нестандартных портах, но если ваш HTTPS-сервер находится на порту 443, то вы, вероятно, можете не учитывать :$server_port на странице error_page. - theJPster


К сожалению, вы не можете обрабатывать запросы http и https с использованием одного порта с nginx,

Однако вы можете использовать прокси-запросы предварительной обработки. Вот как мы обрабатываем схему:

set $real_scheme http;
if ($http_x_forwarded_proto) { set $real_scheme $http_x_forwarded_proto; }

set $target_scheme https;

if ($real_scheme != $target_scheme) {
  rewrite ^ $target_scheme://$host$request_uri redirect;
}

1
2017-12-07 20:45



+1 Хорошо, я вообще не понимаю этот фрагмент кода. Я попробую, но это выглядит довольно сложно. Я думаю, что я просто получу доступ к домену, используя полный URL-адрес, начните php.myadmin.com:12345, - Saif Bechan


Ты можешь переадресовывать доступ к порту 80 до порта 443 (для работы с портами по умолчанию). Но это потребует от вас запускать iptables на этом хосте.

Не уверен, что вы получите 400 а также из-за SSL, но это в основном то, как работает прозрачное проксирование.

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443

Кроме того, вы можете перенаправить http-запросы от порта 80 до порта 443 (или любого порта) в nginx, но не иметь их работу на том же порту, как указано выше.

РЕДАКТИРОВАТЬ: Как упоминалось ниже, под этим подходом будем приводит к 400 из-за протокола смеси.

Будет ли это вариант программным решением проблемы? Попробуйте использовать что-то вроде следующего фрагмента в верхней части стартового файла в phpMyAdmin. Это должно перенаправить ваш первоначальный вызов на https. После этого остальная часть вашей страницы находится в контексте SSL в любом случае, если вы настроили ее на обслуживание через SSL (конечно).

<?php
 if ($_SERVER['SERVER_PORT']!=443) {
     $url = "https://". $_SERVER['SERVER_NAME'] . ":443".$_SERVER['REQUEST_URI'];
     header("Location: $url");
 }
?>

(Явно не спасает вас от прыжков без SSL, например, через закладку, пока ваш сеанс остается в силе)


-2
2017-12-07 20:46



Да, я знаю о перенаправлении портов 80 -> 433. Для nginx вам не нужны iptables, это всего лишь небольшая конфигурация. Дело в том, что я хочу запустить phpmyadmin на нестандартных портах, вот и проблема. - Saif Bechan
Thx для разъяснения этого. Обновлен мой ответ, чтобы отразить его. Возможно, подход программистов помогает. - Chris