Nginx响应“301已永久移动”

8yoxcaq7  于 2023-11-17  发布在  Nginx
关注(0)|答案(1)|浏览(140)

考虑下面的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/ {
现在有些事情改变了。我不会得到和以前一样的错误,而是得到一个“301永久移动”。我如何修复我的nginx配置文件?

关于环境的补充资料

我使用了一个kubernetes部署,部署了nginx反向代理,包括所介绍的配置。然后我使用kubernetes服务暴露nginx。另外,我尝试使用kubernetes ingress来处理这种情况,使用相同的路由,但是ingress服务会返回default backend - 404消息。

7uzetpgm

7uzetpgm1#

正如问题中提到的,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/;
    }
}

字符串
关于入口解决方案,我无法通过将缺少的尾随斜杠添加到路径来使其工作。服务是由于其名称而指定的,因此不能添加尾随斜杠(即,它会导致错误)。

相关问题