You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust的Hyper框架中返回自定义Header但不返回Body?

Hyper框架实现仅返回Header无Body的重定向响应

首先,你的重定向失效根本原因不是返回了Body,而是两个关键错误:

  • Location头写法错误:你把字段名和值合并成了一个字符串,正确写法应该是分开传字段名和值,否则浏览器识别不了这个无效的头字段。
  • 未设置重定向状态码:默认响应状态码是200 OK,浏览器只会对3xx系列状态码(如302临时重定向、301永久重定向)处理Location头触发重定向,200状态下即使有正确Location也不会生效。

要实现仅返回Header无Body的响应,Hyper里可以用Body::empty()创建空Body,同时配合正确的状态码和Location头即可。修正后的代码如下:

use std::{convert::Infallible, net::SocketAddr};
use hyper::{Body, Request, Response, Server, StatusCode};
use hyper::service::{make_service_fn, service_fn};

async fn handle(_: Request<Body>) -> Result<Response<Body>, Infallible> {
    // 创建空Body,实现仅返回Header的效果
    let empty_body = Body::empty();

    let response = Response::builder()
        // 设置302临时重定向状态码,按需可替换为301永久重定向
        .status(StatusCode::FOUND)
        // 正确的Location头写法,建议传完整URL避免路径解析问题
        .header("Location", "https://www.example.com")
        .body(empty_body)
        .unwrap();

    Ok(response)
}

#[tokio::main]
async fn main() {
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

    let make_svc = make_service_fn(|_conn| async {
        Ok::<_, Infallible>(service_fn(handle))
    });

    let server = Server::bind(&addr).serve(make_svc);

    if let Err(e) = server.await {
        eprintln!("server error: {}", e);
    }
}

补充说明:

  • Body::empty()完全符合Response<Body>的返回要求,不会携带任何响应内容。
  • 常用重定向状态码:
    • 301 Moved Permanently:永久重定向,浏览器会缓存该重定向规则
    • 302 Found:临时重定向,浏览器不缓存规则
    • 303 See Other:适合POST请求后的重定向,强制浏览器用GET方法访问目标地址
  • Location头建议使用完整URL(带http/https协议),避免浏览器解析相对路径时出错。

内容的提问来源于stack exchange,提问作者DFG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:30:50