Nginx如何只允许访问/api/端点?
我的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.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。