我知道这个问题肯定已经有人回答了,但我已经搜索了好久,却找不到答案。我想可能是没找对地方,也许有人能帮我。
基本上,我在非标准端口上通过 SSL 运行 phpmyadmin,在此示例中为 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
答案1
我就是这么做的。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...
}
}
答案2
不幸的是,你不能使用 nginx 的单个端口处理 http 和 https 请求。
但是,您可以让代理预先处理请求。以下是我们处理方案处理的方式:
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;
}
答案3
你可以重定向访问端口 80 到端口 443(使用默认端口)。但这需要您在该主机上运行 iptables。
不确定你是否会得到 400也是因为 SSL,但这基本上就是透明代理的工作方式。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443
除此之外,您还可以在 nginx 中将 http 请求从端口 80 重定向到端口 443(或任何端口组合),但不能让它们在同一端口上工作,就像上面提到的那样。
编辑:正如下面提到/评论的这种方法将要由于协议混合,结果为 400。
可以通过编程方式解决问题吗?尝试在 phpMyAdmin 中的启动文件顶部使用类似以下代码片段。这应该会将您的初始调用重定向到 https。此后,只要您将页面配置为通过 SSL 提供服务(当然),其余页面就处于 SSL 上下文中。
<?php
if ($_SERVER['SERVER_PORT']!=443) {
$url = "https://". $_SERVER['SERVER_NAME'] . ":443".$_SERVER['REQUEST_URI'];
header("Location: $url");
}
?>
(只要您的会话仍然有效,就不会明确阻止您通过无 SSL 进行跳转,例如通过书签)