Nginx如何只允许访问/ api /端点?

时间:2019-10-17 06:46:36

标签: nginx

我的API位于api.example.com/api-如何拒绝其他所有内容?因此,用户无法使用api.example.com/api.example.com/login

不幸的是,这个人也拒绝了所有API流量

location ~ /(?!api).* {
    deny all;
}

我目前在nginx config file中拥有的所有位置设置

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /(?!api).* {
        deny all;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您的正则表达式不起作用的原因是,它与URI中没有后跟/的任何api匹配。因此/api/api/api不会被拒绝,但是/foo/api/foo将被拒绝。

通过在正则表达式的开头添加一个锚点(^)可以轻松解决该问题:

location ~ ^/(?!api).* { ... }

另一种方法使用前缀位置:

location / {
    deny all;
}

location /api {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
    internal;

    ...
}

internal指令禁止直接访问以.php结尾的URI。有关详细信息,请参见this document