Rust Iron框架请求URL锚点/fragment被剥离原因咨询
核心原因
这不是框架的bug,是HTTP协议与URI标准的固有规则:
- URL中
#开头的片段(fragment,也就是你说的锚点)从设计上就不会被浏览器发送到服务端。
片段标识符的作用是供客户端(浏览器)本地定位页面内资源,不属于HTTP请求报文的组成部分。浏览器在组装HTTP请求时,会直接把#及其后面的所有内容截断丢弃,你的后端服务从根本上就收不到这部分内容——这也是你测试多款Web框架都遇到相同现象的原因,和框架配置、处理逻辑没有任何关系,属于Web开发的基础常识,因此框架文档一般不会特意单独说明。 - 你在服务端打印
req.url看到的内容,就是浏览器实际发过来的全部URL路径,不存在框架“自动剥离”锚点的行为。
OAuth隐式流获取access_token的正确方案
你无法在Iron这类后端框架的请求处理器中直接拿到放在fragment里的access_token,正确的处理流程是:
- OAuth授权方完成授权后,会携带fragment形式的access_token跳转到你配置的回调地址,这个跳转首先由浏览器接收,fragment部分会被浏览器完整保留
- 为回调地址编写对应的前端页面,通过前端JavaScript读取
window.location.hash属性,拿到完整的锚点内容,解析提取出其中的access_token - 前端拿到token后,再通过接口请求把token传递给后端服务即可。
你提供的测试代码本身没有逻辑错误:
use iron::prelude::*; fn hello_world(req: &mut Request) -> IronResult<Response> { println!("got url: {}", req.url); Ok(Response::with((iron::status::Ok, "Hello World"))) } fn main() { let chain = Chain::new(hello_world); Iron::new(chain).http("localhost:3000").unwrap(); }
不需要在框架配置、路由规则上浪费时间排查,无论怎么调整,服务端都不可能直接收到URL的fragment部分。
补充:如果不想额外写前端解析逻辑,也可以改用OAuth授权码模式,该模式会把授权码放在URL的查询参数(query)中,查询参数属于HTTP请求的正式组成部分,会被浏览器正常发送到服务端,后端可以直接读取处理。
内容的提问来源于stack exchange,提问作者hjfitz
相关产品推荐
相关产品推荐

