HTTP重定向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP重定向相关的知识,希望对你有一定的参考价值。

参考技术A

301是永久重定向,常用的场景是使用域名跳转。

比如,我们访问 http://www.zhihu.com 会跳转到 https://www.zhihu.com ,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

302是临时重定向,用来做临时跳转。接着上面的例子,重定向到 https://www.zhihu.com 的请求又会通过302重定向到 https://www.zhihu.com/signup?next=%2F

不过,看上去301和302都是代表重定向的意思。那具体有啥区别呢?

http 1.0规范中有2个重定向——301和302,在http 1.1规范中存在4个重定向——301、302、303和307。

其中301在http 1.0以及http 1.1中都表示永久重定向,就不讨论了。

那302呢?

在http1.0中,302的规范是这样的:

原请求是post,则不能自动进行重定向;原请求是get,可以自动重定向。

但是浏览器和服务器的实现并没有严格遵守HTTP中302的规范,服务器不加遵守的返回302,浏览器即便原请求是post也会自动重定向,导致规范和实现出现了二义性。

所以HTTP 1.1中将302的规范细化成了303和307

继承了HTTP 1.0中302的实现(即原请求是post,也允许自动进行重定向,结果是无论原请求是get还是post,都可以自动进行重定向)。

307则继承了HTTP 1.0中302的规范(即如果原请求是post,则不允许进行自动重定向,结果是post不重定向,get可以自动重定向)。

如何配置 Krakend 使其按原样返回 http 重定向响应而不是遵循 http 重定向?

【中文标题】如何配置 Krakend 使其按原样返回 http 重定向响应而不是遵循 http 重定向?【英文标题】:How to configure Krakend so it return http redirect response as-is instead of following the http redirect? 【发布时间】:2020-11-06 00:12:45 【问题描述】:

我目前正在使用 Krakend (https://krakend.io) API Gateway 将请求代理到我的后端服务。我的后端服务 API 响应之一是带有 http 303 的重定向响应。重定向响应如下所示:

HTTP/1.1 303 See Other
content-length: 48
content-type: text/plain; charset=utf-8
date: Thu, 16 Jul 2020 10:25:41 GMT
location: https://www.detik.com/
vary: Accept
x-powered-by: Express
x-envoy-upstream-service-time: 17
server: istio-envoy

问题在于,Krakend 并没有将 http 303 响应返回给客户端(带有位置响应标头)as-is,实际上是在遵循 http 重定向并返回重定向 Url 的响应,这是https://www.detik.com/的html响应。

我当前的 krakend 配置如下所示:


  "version": 2,
  "extra_config": 
    "github_com/devopsfaith/krakend-cors": 
      "allow_origins": [],
      "expose_headers": [
        "Content-Length",
        "Content-Type",
        "Location"
      ],
      "allow_headers": [
        "Content-Type",
        "Origin",
        "X-Requested-With",
        "Accept",
        "Authorization",
        "secret",
        "Host"
      ],
      "max_age": "12h",
      "allow_methods": [
        "GET",
        "POST",
        "PUT"
      ]
    ,
    "github_com/devopsfaith/krakend-gologging": 
      "level": "ERROR",
      "prefix": "[GATEWAY]",
      "syslog": false,
      "stdout": true,
      "format": "default"
    ,
    "github_com/devopsfaith/krakend-logstash": 
      "enabled": false
    
  ,
  "timeout": "10000ms",
  "cache_ttl": "300s",
  "output_encoding": "json",
  "name": "api-gateway",
  "port": 8080,
  "endpoints": [
    
      "endpoint": "/ramatestredirect",
      "method": "GET",
      "extra_config": ,
      "output_encoding": "no-op",
      "concurrent_calls": 1,
      "backend": [
        
          "url_pattern": "/",
          "encoding": "no-op",
          "sd": "static",
          "extra_config": ,
          "method": "GET",
          "host": [
            "http://ramatestredirect.default.svc.cluster.local"
          ],
          "disable_host_sanitize": false
        
      ]
    
  ]

那么我怎样才能让 krakend 将原始的 http 303 响应从我的后端服务返回到客户端?

谢谢

【问题讨论】:

嗨!你有没有找到这个问题的答案?因为我目前遇到了完全相同的问题。 【参考方案1】:

我假设您正在调用此端点 /ramatestredirect

要获取后端http状态码(如您所说,它返回303 http状态码),您可以使用这种方式:


  "endpoint": "/ramatestredirect",
  "method": "GET",
  "extra_config": ,
  "output_encoding": "no-op",
  "concurrent_calls": 1,
  "backend": [
    
      "url_pattern": "/",
      "encoding": "no-op",
      "sd": "static",
      "extra_config": 
        "github.com/devopsfaith/krakend/http": 
          "return_error_details": "authentication"
        
      ,
      "method": "GET",
      "host": [
        "http://ramatestredirect.default.svc.cluster.local"
      ],
      "disable_host_sanitize": false
    
  ]

所以,基本上有了这个插件就可以得到原始的后端http状态码

"github.com/devopsfaith/krakend/http": 
          "return_error_details": "authentication"
        

【讨论】:

像魅力一样工作!你是最棒的!

以上是关于HTTP重定向的主要内容,如果未能解决你的问题,请参考以下文章

无法在发送 HTTP 标头之后进行重定向

将 HTTP 重定向到 HTTPS(中间件重定向 vs Nginx)

如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点

IIS HTTP重定向配置参数设置

重定向与负载均衡

浏览器302重定向传递hash