nginx http 重定向错误地将参数加倍(通过 AWS ELB)

nginx http 重定向错误地将参数加倍(通过 AWS ELB)

例如,当我浏览

http://example.com/foo?x=1&y=2

nginx 将我重定向到

https://example.com/foo?x=1&y=2?x=1&y=2

现在,如果我继续重定向,我会得到

https://example.com/foo?x=1&y=2?x=1&y=2?x=1&y=2?x=1&y=2

它不断地使参数翻倍,不知道我做错了什么。

我的 nginx 配置:

server {
  listen 80;
  listen 443 ssl;

  server_name {{ .SERVER_NAME }} www.{{ .SERVER_NAME }};

  ssl_certificate     /etc/ssl/nginx.crt;
  ssl_certificate_key /etc/ssl/nginx.key;

  if ($http_x_forwarded_proto != "https") {
      rewrite ^(.*)$ https://$server_name$REQUEST_URI permanent;
  }

  # Nginx will reject anything not matching /
  location / {
    # Reject requests with unsupported HTTP method
    if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH)$) {
      return 405;
    }

    # Only requests matching the whitelist expectations will
    # get sent to the application server
    proxy_pass http://site_container:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_redirect     off;
    proxy_set_header   Host                 $http_host;
    proxy_set_header   X-Real-IP            $remote_addr;
    proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto    $http_x_forwarded_proto;
    proxy_set_header   X-Forwarded-Port     $http_x_forwarded_port;
    proxy_cache_bypass $http_upgrade;
  }
}

这是一个 ECS 架构,其中 nginx 和 app 容器位于同一个 EC2 实例上。

答案1

rewrite指令默认将查询字符串附加到替换 URL,方式类似于 Apache 的[QSA]。从文档

如果替换字符串包含新的请求参数,则先前的请求参数将附加在其后。如果不希望这样,可以在替换字符串末尾放置问号以避免附加这些参数,例如:

rewrite ^/users/(.*)$ /show?user=$1? last;

但那是不是您应该如何解决这个问题。

这还有一个问题,即 http 到 https 的重定向效率低下。这if必须评估每一个请求,并且rewrite有一个免费的正则表达式。请参阅征税重写了解更多信息。

相反,您应该有一个完全独立的serverHTTP 和 HTTPS 块,并从 HTTPS块中完全删除if/ 。rewriteserver

server {
  listen 80;
  listen [::]:80; # You also forgot this...

  server_name {{ .SERVER_NAME }} www.{{ .SERVER_NAME }};

  return 301 https://{{ .SERVER_NAME }}$request_uri;
}

相关内容