Nginx:强制在一个路径上使用 SSL,在其他路径上使用非 SSL

Nginx:强制在一个路径上使用 SSL,在其他路径上使用非 SSL

如何设置 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 的答案更好。

相关内容