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

Nginx如何只允许访问/api/端点?,nginx,Nginx,我的API位于API.example.com/API——我怎么能拒绝其他一切?因此,用户不能去,例如,api.example.com/或api.example.com/login 不幸的是,这一个也拒绝了所有API流量 location ~ /(?!api).* { deny all; } 目前在我的nginx配置文件中的所有位置设置 location / { try_files $uri $uri/ /index.php?$query_string;

我的API位于
API.example.com/API
——我怎么能拒绝其他一切?因此,用户不能去,例如,
api.example.com/
api.example.com/login

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

location ~ /(?!api).* {
    deny all;
}
目前在我的
nginx配置文件中的所有位置设置

    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;
    }

有什么建议吗?

正则表达式不起作用的原因是它匹配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。有关详细信息,请参阅。

正则表达式不起作用的原因是它匹配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。有关详细信息,请参阅。

您的配置中有一个
/index.php
。这也应该被否认,还是运行您的API?@RichardSmith index.php启动了我的服务器端框架,所以是的,它在技术上运行我的API。嗯,那么我应该允许index.php&/api/routes吗?您的配置中有一个
/index.php
。这也应该被否认,还是运行您的API?@RichardSmith index.php启动了我的服务器端框架,所以是的,它在技术上运行我的API。嗯,那么我应该允许index.php&/api/routes吗?谢谢你的时间。我尝试了各种组合,但我只能禁止访问全部或全部。您建议的替代方法看起来非常有希望,但所有API调用都返回403。你还有其他建议吗?在最坏的情况下,我需要在代码库级别处理重定向/禁止。这还不是世界末日,但通过编辑服务器配置来解决这一问题会很酷。请查看访问日志和错误日志,并确定导致403响应的URI。感谢您抽出时间。我尝试了各种组合,但我只能禁止访问全部或全部。您建议的替代方法看起来非常有希望,但所有API调用都返回403。你还有其他建议吗?在最坏的情况下,我需要在代码库级别处理重定向/禁止。这还不是世界末日,但通过编辑服务器配置来解决这个问题会很酷。查看访问日志和错误日志,并确定导致403响应的URI。