Nginx只允许root和api位置

时间:2018-02-09 09:31:23

标签: nginx webserver web-hosting access-control nginx-location

我将服务器配置为我的服务器的反向代理。我想拒绝所有请求,除了两个位置,一个用于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

    }

}

如何设置此配置?

2 个答案:

答案 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