考虑以下nginx配置文件:
server {
listen 443;
ssl on;
ssl_certificate /etc/tls/cert.pem;
ssl_certificate_key /etc/tls/key.pem;
location / {
proxy_pass http://api.default.svc.cluster.local;
}
}
443上的所有传入TCP请求都应该重定向到在api.default.svc.cluster.local:80
上运行的服务器(这是一个节点REST-Api btw)。这很好,我可以curl https://<nginx-IP>/
nginx并按预期得到正确的响应。
现在,我想将位置从/
更改为/api
,因此我可以触发curl https://<nginx-IP>/api
以获得与之前相同的响应。
1。尝试
所以我将配置中的位置线更改为:
location /api {
不幸的是,这不会起作用,而是我收到一个错误Cannot GET /api
,这是一个节点错误,所以很明显它会被路由到api但是还有一些东西仍然很臭。
2。尝试
似乎URI中的尾部斜杠是必需的,因此我将其添加到以下位置:
location /api/ {
现在发生了变化。我没有像以前那样得到同样的错误,相反,我得到了永久性的&#34; 301&#34;。如何修复我的nginx配置文件?
有关环境的其他信息
我正在使用部署nginx反向代理的kubernetes部署。配置介绍。然后我使用kubernetes服务公开nginx。此外,我尝试使用kubernetes ingress来处理这种情况,使用相同的路由,但是,入口服务将使用default backend - 404
消息进行响应。
答案 0 :(得分:2)
正如问题所述,URI中的尾部斜杠很重要。我已将其修复到该位置,但是,我没有将其添加到使用proxy_pass
传递的URI中。
至于nginx代理我使用以下配置工作:
server {
listen 443;
ssl on;
ssl_certificate /etc/tls/cert.pem;
ssl_certificate_key /etc/tls/key.pem;
location /api/ {
proxy_pass http://api.default.svc.cluster.local/;
}
}
关于入口解决方案,我无法通过向路径添加缺少的尾部斜杠来使其工作。该服务由于其名称而被指定,因此不能添加尾部斜杠(即,它将导致错误)。