一尘不染

使用Nginx时缺少HTTP状态代码名称

spring-boot

我正在使用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
,或者我在这里什么都错过了。如果您可以提供帮助,那就太好了。


阅读 248

收藏
2020-05-30

共1个答案

一尘不染

  • 您拥有的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状态代码, 而没有状态 “名称” 。首先,状态代码“名称”(例如Moved Temporarilyafter 302Createdafter之后)201对任何东西都不是必不可少的,因此,即使在极少的情况下它们都丢失了,也不清楚-不清楚为什么在nginx中会丢失它们首先,您没有提供进一步的详细信息来启用疑难解答-无论如何,它实际上并不会影响任何其他功能(但是,再次,没有证据表明是nginx导致了它们的丢失,事实上,nginx确实做到了定义"201 Created"ngx_http_status_lines的字符串的内阵列src/http/ngx_http_header_filter_module.c)。

但是,最近在邮件列表中出现了有关 HTTP状态代码 的相关问题-
“重新:阻止nginx将303响应(请参阅其他信息)转换为302(临时重定向)”
-并且指出,将nginx放在您的前面根据http://nginx.org/r/proxy_http_version,后端默认情况下可能会导致HTTP
/ 1.1方案更改为HTTP / 1.0
,这可能会导致您的非nginx后端对HTTP进行不同的处理以符合1.0规格
; 解决方案是将其添加proxy_http_version 1.1到nginx。

2020-05-30