仅允许 api 路由(api/*)访问端口 80 和 403,其余重定向到 443

仅允许 api 路由(api/*)访问端口 80 和 403,其余重定向到 443

我目前已将 nginx 配置为将端口 80 重定向到端口 443。

server {
   listen [::]:443 ssl
   listen 443 ssl;

   root /var/www/my_app/public;

   server_name example.com www.example.com;

   # rest of my main config
}

# Here is port 80 listen
server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    listen [::]:80 default_server;
}

如果我注释掉第二个服务器块并添加listen 80 default_server; listen [::]:80 default_server;到上面的块,它将允许 http 和 https 访问。

我想要实现的是,如果 url 包含,example.com/api/*则不将 http 重定向到 https,但对于其余的 url,重定向到 https。

  • example.com/api/login = 允许 http
  • example.com/api/test = 允许 http
  • example.com/api-docs = 重定向到 https
  • example.com/anything = 重定向到 https

我如何使用 nginx 实现这一点?我是否需要有 2 个服务器块并将共享逻辑移动到单独的文件中,并针对每个端口分别考虑它们?

答案1

对端口 80 使用以下块,而不是您已有的块:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/my_app/public;

    location /api {
        # API specific directives
    }

    location / {
        return 301 https://www.example.com;
    }
}

相关内容