jQuery.ajax 中使用的包含问号的 URL 在特定设置中发生变化(Docker,Nginx 重写规则)

URLs containing question marks used in jQuery.ajax change in specific setup (Docker, Nginx rewrite rule)

我有一个 dockerized PHP/Laravel 应用程序,它在 php:7.4-apache 容器中运行良好。出于开发目的,我们将其路由到 http://localhost:81

现在我们希望该服务在我们的微服务网络中的 http://localhost/foo/bar 处可用。向 localhost 请求转到 nginx 服务,我们在 nginx_cors.conf 中设置了一个重写规则来实现这一点:

location /foo/bar {
  rewrite ^/foo/bar/?(.*) / break;
  proxy_pass http://laravel_app;
}

但现在一些 jQuery.ajax 请求失败了。事情是这样的:

// in vendor code
// url is http://localhost/foo/bar/ajax/lib/?someParam=someValue
$.ajax({
  url: url
});

// in Chrome DevTools
// Note that foo/bar/ is gone
jquery.js:4 GET http://localhost/ajax/lib?someParam=someValue 404 (Not Found)

该问题似乎影响所有包含问号的 URL。我们为不包含参数的请求剥离了它,请求通过了。但在上述情况下这是不可能的。

这里发生了什么?我不确定 nginx 重写规则是否是罪魁祸首,因为我根本不希望浏览器注意到它的效果(上面的错误消息来自 Chrome DevTools)。

编辑

查看 Chrome 中的网络选项卡,我发现有两个类似的请求:

所以 nginx 'forwards' 似乎是对自己的第一个请求,而不是 Laravel 应用程序。

/ajax/lib//ajax/lib 的重定向似乎是由 laravel 应用而不是 nginx 本身发出的。重写 Location header 的默认 nginx 行为是将后端 hostname/protocol 替换为 http://laravel_app/ajax/lib 重写为 http://localhost/ajax/lib 的请求。该请求不会属于 location /foo/bar { ... } 并且会由其他一些 nginx 位置提供给您 HTTP 404 Not found 错误。您需要使用以下指令覆盖默认的 proxy_redirect 行为:

proxy_redirect http://laravel_app/ http://localhost/foo/bar/;