【问题标题】:HTTP status code names are missing when using Nginx使用 Nginx 时缺少 HTTP 状态代码名称
【发布时间】:2018-07-04 10:02:35
【问题描述】:

我正在使用 Nginx 来

将所有 HTTP 请求重定向到 HTTPS

在我的 Spring Boot 应用程序中。这是我正在使用的 nginx 配置,我能够将所有请求重定向到 Https,但是当我这样做时,我得到了正确返回的 状态代码但它不再具有状态代码名称。如果我删除 nginx 并单独运行 spring boot 应用程序,我可以使用它的 代码名称和代码获取 http 状态。

server {

  listen 80 default_server;
  listen [::]:80 default_server;
  server_name _ ;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


  if ( $http_x_forwarded_proto != 'https' ) {
    return 307 https://$host$request_uri;
  }

  location / {
    proxy_set_header X-Forwarded-Proto http;
    proxy_pass http://localhost:7070;
      expires -1;
  }

}

我在这里做错了什么,我应该使用 proxy_redirect 而不是 proxy_pass,还是我在这里遗漏了任何东西。如果你能提供帮助,那就太好了。

【问题讨论】:

  • 你说“它没有状态码名称”到底是什么意思?
  • 我得到201,但我希望它是201 created
  • 你到底为什么在乎?状态代码名称对任何机器都没有任何意义。
  • 请您澄清一下“它不再有状态代码名称”吗?您是在谈论 nginx 对 HTTPS 代理请求的响应吗?您如何阅读状态行?您能否包含请求 + 响应日志并通过对比预期和观察到的测量值来解释问题?

标签: java spring-boot nginx load-balancing reverse-proxy


【解决方案1】:

在同一个配置文件中

监听 80 将 req 重定向到 https (443)

server {
    listen 80;
    listen [::]:80;
    server_name your_url.com www.your_url.com; 
    return 301 https://your_url.com$request_uri;
}

在 433 上收听

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    location / {
            # proxy pass to your app

            proxy_pass http://localhost:7070;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
    }

这就是我的做法,非常适合我,干杯!

【讨论】:

  • 谢谢,但这并没有真正奏效。现在所有请求都失败告诉service is unavailable
  • 确保 1. 您的应用在 7070 上运行。2. 您的 SSL 证书配置正确
【解决方案2】:
  • 您拥有的 nginx.conf 代码有点混乱和不完整,因为您实际上没有显示任何实际服务 https 的代码,因此,不清楚整个设置将如何工作完全没有。

  • proxy_redirect 通常应保留其默认值default,除非您明确知道要将其更改为什么;请参阅http://nginx.org/r/proxy_redirect 的文档。

  • 条件重定向,例如if ( $http_x_forwarded_proto != 'https' ) {return 307 https://$host$request_uri;},通常只需要在您的后端;目前还不清楚为什么你的 nginx 中有这个,除非你在它前面有另一个 nginx,这有点多余并且可能没有必要。

  • 最后,您主要关心的是 HTTP 状态代码 可能会在没有状态 "names" 的情况下返回。首先,status code "names", like Moved Temporarily after 302, or Created after 201 对任何事情都不是必不可少的,因此,即使在不太可能的情况下它们丢失了——目前还不清楚为什么它们首先会在 nginx 中丢失,而你没有提供启用故障排除的更多细节——它不应该真正影响任何其他功能(但是,同样,没有证据表明是 nginx 导致它们丢失,事实上,nginx 确实在 @987654323 中定义了 "201 Created" @)。

    但是,最近在邮件列表中出现了一个与 HTTP 状态代码 相关的问题 — "Re: prevent nginx from translate 303 responses (see other) to 302 (temporary redirect)" — 有人指出,将 nginx 放在您的前面默认情况下,后端可能会导致 HTTP/1.1 方案更改为 HTTP/1.0,根据 http://nginx.org/r/proxy_http_version,这可能会导致您的非 Nginx 后端对 HTTP to comply with the 1.0 spec 有不同的处理;解决方案是将proxy_http_version 1.1 添加到nginx。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2013-10-25
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多