找不到原始文件时如何使用 Iron 的静态文件提供后备文件?
How to serve a fallback file using Iron's staticfile when the original file is not found?
我正在使用 Iron 为 React 站点提供服务。如果文件或目录不存在,我试图让它服务 index.html。
fn staticHandler(req: &mut Request) -> IronResult<Response> {
let url = Url::parse("http://localhost:1393").unwrap();
let getFile_result = Static::handle(&Static::new(Path::new("../html")), req);
match getFile_result {
Ok(_) => getFile_result,
Err(err) => {
Static::handle(
// returns 404 error - ../html/index.html returns 500
&Static::new(Path::new("localhost:1393/index.html")),
req,
)
}
}
}
如果我转到 localhost:1393,如果我转到 localhost:1393/not-a-directory,我会得到我的索引页,我只是得到一个错误。
有没有办法重定向(不改变 url)或其他解决方案?
这不是 How to change Iron's default 404 behaviour? 的副本,因为我试图处理用户请求的静态资产不存在的情况,而不是未定义路由的情况。
正如在 staticfile issue #78 titled "Static with fallback" 上讨论的那样,您可以包装处理程序,检查 404,并改为提供文件:
struct Fallback;
impl AroundMiddleware for Fallback {
fn around(self, handler: Box<Handler>) -> Box<Handler> {
Box::new(FallbackHandler(handler))
}
}
struct FallbackHandler(Box<Handler>);
impl Handler for FallbackHandler {
fn handle(&self, req: &mut Request) -> IronResult<Response> {
let resp = self.0.handle(req);
match resp {
Err(err) => {
match err.response.status {
Some(status::NotFound) => {
let file = File::open("/tmp/example").unwrap();
Ok(Response::with((status::Ok, file)))
}
_ => Err(err),
}
}
other => other
}
}
}
我正在使用 Iron 为 React 站点提供服务。如果文件或目录不存在,我试图让它服务 index.html。
fn staticHandler(req: &mut Request) -> IronResult<Response> {
let url = Url::parse("http://localhost:1393").unwrap();
let getFile_result = Static::handle(&Static::new(Path::new("../html")), req);
match getFile_result {
Ok(_) => getFile_result,
Err(err) => {
Static::handle(
// returns 404 error - ../html/index.html returns 500
&Static::new(Path::new("localhost:1393/index.html")),
req,
)
}
}
}
如果我转到 localhost:1393,如果我转到 localhost:1393/not-a-directory,我会得到我的索引页,我只是得到一个错误。
有没有办法重定向(不改变 url)或其他解决方案?
这不是 How to change Iron's default 404 behaviour? 的副本,因为我试图处理用户请求的静态资产不存在的情况,而不是未定义路由的情况。
正如在 staticfile issue #78 titled "Static with fallback" 上讨论的那样,您可以包装处理程序,检查 404,并改为提供文件:
struct Fallback;
impl AroundMiddleware for Fallback {
fn around(self, handler: Box<Handler>) -> Box<Handler> {
Box::new(FallbackHandler(handler))
}
}
struct FallbackHandler(Box<Handler>);
impl Handler for FallbackHandler {
fn handle(&self, req: &mut Request) -> IronResult<Response> {
let resp = self.0.handle(req);
match resp {
Err(err) => {
match err.response.status {
Some(status::NotFound) => {
let file = File::open("/tmp/example").unwrap();
Ok(Response::with((status::Ok, file)))
}
_ => Err(err),
}
}
other => other
}
}
}