我的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;
}
有什么建议吗?
答案 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。