我将服务器配置为我的服务器的反向代理。我想拒绝所有请求,除了两个位置,一个用于root,另一个用于api root。
所以服务器应该只允许对给定路径的请求
example.com/ (only the root)
example.com/api/ (every url after the api root)
预期的行为是服务器应该拒绝所有以下可能性。
example.com/location
example.com/location/sublocation
example.com/dynamic-location
我当前的nginx配置,
server {
# server configurations
location / {
# reverse proxy configurations
}
}
如何设置此配置?
答案 0 :(得分:5)
这是:
location = / {
# would serve only the root
# ...
}
location /api/ {
# would serve everything after the /api/
# ...
}
您需要一个特殊的'='修饰符,以使根位置按预期工作
来自docs:
使用“=”修饰符可以定义URI的完全匹配 和位置。如果找到完全匹配,则搜索终止。对于 例如,如果经常发生“/”请求,则定义“location = /” 当搜索终止时,将加速处理这些请求 在第一次比较之后。
答案 1 :(得分:3)
您可以使用if
语句来测试$request_uri
是否等于root,或者从/api/
开始,所有语句都在同一location
语句中,或{ {1}}上下文:
server
然而,或者,由于处理方式的完成,使用nginx的最有效方法是使用3个单独的if ($request_uri !~ ^/$|^/api/) {return 403;}
指令,每个指令处理3种可能性中的一种 - location
根精确匹配,/
前缀,然后是所有其他内容,按http://nginx.org/r/location。
此外,如果您还要求根位置禁止查询字符串,您可以根据需要测试$is_args
(或$args
/ $query_string
),或者直接测试整个请求网址是否完全/api/
或是否还有其他内容(请注意,/
指令本身不会基于$request_uri
运行,而是基于$uri
,略有不同)。
location