Answers:
在您的nginx配置中,您应该有两个“服务器”区域。一个用于端口80,另一个用于端口443(非SSL和SSL)。只需在非SSL网站上添加一个位置即可重定向到您的SSL页面。
server {
root /var/www/
location / {
}
location /user {
rewrite ^ https://$host$request_uri? permanent;
}
}
它将所有以/ user结尾的流量转发到您的https://服务器。
然后,在443服务器中,执行相反的操作。
server {
listen 443;
root /var/www/
location / {
rewrite ^ http://$host$request_uri? permanent;
}
location /user {
}
}
/user
,non-ssl表示所有其他url。结果,即使用户明确https://www.example.com/
输入浏览器的地址栏,结果页面也为http://www.example.com/
。有没有一种方法可以通过此答案中所述的设置在ssl / non-ssl之间实现自动url重写,但是如果用户在地址栏中明确键入了ssl请求,仍然可以遵循该请求?谢谢!
Nginx允许在同server
一块中同时处理HTTP和HTTPS 。因此,您不必为两者都重复指令,并且可以重定向要保护的路径
server {
listen 80 default_server;
listen 443 ssl;
... ssl certificate and other configs ...
location /user {
if ($scheme = 'http') {
rewrite ^ https://$http_host$request_uri? permanent;
}
}
... your basic configuration ...
}
确保不要在ssl on
此处放置行,因为它将破坏普通的HTTP。
(可选)您可以使用以下方法将所有其他请求从HTTPS重定向回HTTP:
if ($scheme = 'https') {
rewrite ^ http://$http_host$request_uri? permanent;
}
更新:正如Alexey Ten在评论部分所指出的那样,检查scheme
每个请求并不是一个非常明智的主意。您应该按照声明性的方式配置nginx。在这种情况下,用重定向声明两个服务器块location
,将公共逻辑移动到一个单独的文件中,include
并在这两个文件中。因此,GruffTech的答案更好。
include
指令作为通用指令。重复一些就可以了。