如何设置 Nginx conf 文件以强制仅在我的站点中的其中一个路径上使用 SSL,而其余所有路径上均不使用 SSL?
例如,我希望 /user 下的所有 URL 都是 https,但其余所有 URL 都是 http。
对于第一部分我有:
rewrite ^/user(.*) https://$http_host$request_uri?;
我不想使用“if”。我认为它会利用操作顺序,但我不想陷入循环。
答案1
在您的 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 {
}
}
答案2
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 的答案更好。