【问题标题】:nginx rewrite POST requestnginx 重写 POST 请求
【发布时间】: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


【解决方案1】:

我猜,你不需要重写。

location /foo/bar/ {
  proxy_pass http://myapp/;
}

这应该会从代理 URL 中删除 /foo/bar 部分。

【讨论】:

  • 谢谢。我将其更改为location = /foo/bar/blah { proxy_pass http://myapp/foo/blah; },它按预期工作。
  • @TravErse 你应该接受这个答案,这样 Alexey 才能获得荣誉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2019-05-11
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多