将proxy_pass限制为包含通配符名称的变量位置

时间:2015-01-06 10:12:08

标签: regex nginx reverse-proxy http-proxy

我有一个配置,我使用两个服务器,一个作为代理,一个包含所有业务逻辑,数据库等。

在代理服务器上,我使用nginx建立与外界的SSL连接,因此业务逻辑仅在Intranet中可用。

使用代理我想限制对业务逻辑的某些部分的访问。我只想提供对GeoServer的API的访问,而不是对管理界面的访问。因此,我限制访问/geoserver/abc_def/wfs之类的位置。我使用以下代理配置:

location ~ "^/geoserver/(?<building>[a-zA-Z0-9_-]+)/wfs(?<req>.*)" {
    proxy_pass http://x.y.z.a/geoserver/$building/wfs$req;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

除查询字符串外,这个工作原理。有效请求为/geoserver/abc_def/wfs?version=2.0.0&service=wfs&request=GetCapabilities,但代理不会传递以?开头的查询字符串。

这对我来说似乎有点不对劲。 实际上我只想限制位置/geoserver/*/wfs才能被代理。

1 个答案:

答案 0 :(得分:0)

查询args没有在location指令中捕获,它们可以通过$ args变量

访问

$ is_args变量还包含问号,如果$ args不为空

所以看起来你需要这样的东西

location ~ ^/geoserver/([a-zA-Z0-9_-]+)/wfs$ {
proxy_pass http://x.y.z.a/geoserver/$1/wfs$is_args$args
...