【发布时间】:2017-08-06 04:27:49
【问题描述】:
我需要向我的 nginx 前端服务器发送 POST 请求,该服务器应该将其重定向到上游服务器。 详情:
向http://192.168.0.10/foo/bar/blah发送请求,该请求中的URL应更改为http://192.168.0.21[22,23]:8080/foo/blah
upstream myapp {
server 192.168.0.21:8080;
server 192.168.0.22:8080;
server 192.168.0.23:8080;
}
server {
listen 80;
server_name localhost;
location /foo/bar/blah/ {
rewrite ^/foo/blah^/ /$1 break;
proxy_pass http://myapp;
}
但在 nginx 错误日志中,我看到我的请求从 POST 更改为 GET,而且似乎也没有更改 URL:
"POST /foo/bar/blah HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64)
"GET /foo/bar/blah/ HTTP/1.1" 404 117 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64)
如何保留我的 POST 请求并更改 URL?
还有关于我的重写规则
rewrite ^/foo/blah^/ /$1 break;
我找到了很多更改 URL 的示例,所有示例看起来都一样。 对我来说真的很奇怪,这个重写规则如何将 URL 从 /foo/bar/blah/ 更改为 /foo/blah/: 在文档中说: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
如果指定的正则表达式匹配一个请求 URI,则 URI 是 按照替换字符串中的指定进行更改。
但在我的情况下,请求 URI 是 /foo/bar/blah/ 所以正则表达式 /foo/blah^/ 不匹配 URI,所以这个规则不应该工作。 我说的对吗?
任何建议都会有所帮助。
统一更新: 固定:
location = /foo/bar/blah {
proxy_pass http://myapp/foo/blah;
}
【问题讨论】:
-
好吧,如果你 POST 到
/foo/bar/blah,那么即使location /foo/bar/blah/也不应该首先匹配它(没有尾部斜杠。) // 如果你希望客户端不更改请求方法重定向,那么您需要使用307 Temporary Redirect。但看起来您并不想真正重定向客户端,而是在内部传递数据,以便您的 nginx 充当代理。这些是不同的东西…… -
那么如何创建正确的规则呢?我刚刚在我的重写中删除了斜杠,它似乎开始发送 POST 但仍然没有重写 URI
标签: post nginx url-rewriting request