A client IP address extractor for Axum
It sequentially looks for an IP in:
x-forwarded-for
header (de-facto standard)x-real-ip
headerforwarded
header (new standard)axum::extract::ConnectInfo
(if not behind proxy)The most often issue with this extractor is using it after one consuming body e.g. Json
.
To fix this rearrange extractors in your handler definition moving body consumption to the
end, details.
```rust,norun use axum::{routing::get, Router}; use axumclient_ip::ClientIp; use std::net::SocketAddr;
pub async fn handler(ClientIp(ip): ClientIp) -> String { ip.to_string() }
async fn main() { let app = Router::new().route("/", get(handler));
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(
// Don't forget to add `ConnetInfo` if you aren't behind a proxy
app.into_make_service_with_connect_info::<SocketAddr>()
)
.await
.unwrap()
} ```
We appreciate all kinds of contributions, thank you!
Most of the readme is automatically copied from the crate documentation by cargo-sync-readme. This way the readme is always in sync with the docs and examples are tested.
So if you find a part of the readme you'd like to change between <!-- cargo-sync-readme start -->
and <!-- cargo-sync-readme end -->
markers, don't edit README.md
directly, but rather change
the documentation on top of src/lib.rs
and then synchronize the readme with:
bash
cargo sync-readme
(make sure the cargo command is installed):
bash
cargo install cargo-sync-readme
If you have [rusty-hook] installed the changes will apply automatically on commit.
This project is licensed under the MIT license.