Назад | Перейти на главную страницу

Перенаправить 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

Я делаю именно это. gWaldo правильный, но вы не хотите обслуживать контент через HTTP, а только перенаправлять. Хитрость в том, чтобы поймать ошибку http-on-an-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...
    }
}

К сожалению, вы не можете обрабатывать запросы 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;
}

Ты можешь перенаправить доступ к порту 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, например, через закладку, пока ваш сеанс еще действителен)