如何在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
相关产品推荐
相关产品推荐

