Я знаю, что на это, должно быть, уже был дан ответ, но я долго искал и не могу найти ответа. Думаю, просто не ищу в нужном месте, может, кто-нибудь мне поможет.
В основном я запускаю 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, например, через закладку, пока ваш сеанс еще действителен)