我希望设置一个 nginx 反向代理,以便在我们的应用程序中更轻松地进行一些即将到来的服务器移动和负载平衡实现。由于我们的服务器都是 IIS,因此区分大小写不是问题,但现在使用 nginx,这对我来说成了问题。我只是想不分大小写地进行重写。
基础设施说明:
- 所有后端服务器都是 IIS
- 大多数服务都是 WCF 服务
- 我正在尝试简化 URL,以便在我们继续构建时可以移动服务
由于以下错误,我无法将我的位置设置为不区分大小写:
nginx:[emerg]“proxy_pass”不能在正则表达式给出的位置、命名位置内、“if”语句内或 /etc/nginx/sites-enabled/test.conf:101 中的“limit_except”块内有 URI 部分
我尝试处理重写的配置文件的主要部分如下
location /svc_test {
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header host $http_host;
proxy_pass http://backend/serviceSite/WFCService.svc;
}
location ~* /test {
rewrite ^/(.*)/$ /svc_test/$1 last;
}
我无法弄清楚 /test 位置。如果我调用,http://nginxserver/svc_test/help
WCF 帮助页面会正确显示,我可以进行所有可用的 REST 调用。这肯定是我这边愚蠢的正则表达式问题,但我已经尝试了几种变体,但我得到的都是来自 nginx 的 404 或 500 错误。这不是什么难事,所以有人能给我指出正确的方向,让我看起来像个白痴,然后继续前进吗?
答案1
最终让我到达目标的正确正则表达式是
rewrite ^/([^/]*)(.*)$ /svc_test$2;
其结果如下:
- /test -> WCF 服务信息页面
- /测试/ -> 错误(正确)
- /test/help -> WCF 服务端点帮助页面
- /test/contacts/1 -> 从获取联系人接口拉取
- /test/contacts -> 拉取完整联系人列表
我(显然)远非一名熟练掌握正则表达式的人,因此这可能不是处理不区分大小写的重写的最佳方式,但它确实完成了我想要完成的所有任务。我唯一想添加的是将 /test/ 重写为 /test 以防止出现任何错误页面,但这不会影响服务调用。