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 中的网络选项卡,我发现有两个类似的请求:
- 一个按预期进入
http://localhost/foo/bar/ajax/lib/?someParam=someValue
。 nginx 响应 301 和位置 header http://localhost/ajax/lib?someParam=someValue
.
- 第二个去
http://localhost/ajax/lib?someParam=someValue
,这正是第一个请求的位置 header。 nginx 再次响应,这次是 404.
所以 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/;
我有一个 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 中的网络选项卡,我发现有两个类似的请求:
- 一个按预期进入
http://localhost/foo/bar/ajax/lib/?someParam=someValue
。 nginx 响应 301 和位置 headerhttp://localhost/ajax/lib?someParam=someValue
. - 第二个去
http://localhost/ajax/lib?someParam=someValue
,这正是第一个请求的位置 header。 nginx 再次响应,这次是 404.
所以 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/;