php+http+cdn+src+ip,传递最终真实请求 IP

传递最终真实请求 IP

源站获取客户端真实 IP

CDN 回源时会将客户端真实 IP 放在请求头中的 Cdn-Src-Ip 字段中,可以在源站使用 tcpdump 抓包拿到请求信息:

[root@iz28wru16cpz ~]# tcpdump -i any -Ans 0 'dst port 80'

……

r...P..h....GP....~..GET / HTTP/1.1

Host: www.fangwenjun.com

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36

DNT: 1

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Cookie: _ga=GA1.2.1951940815.1541592777; _gid=GA1.2.395342428.1541592777; __atuvc=2%7C45

Cdn-Src-Ip: 111.22.13.3

Accept-Encoding: gzip

X-Via: 1.1 zhdx151:8 (Cdn Cache Server V2.0), 1.1 tongdianxin97:6 (Cdn Cache Server V2.0)

Connection: keep-alive

其中 Cdn-Src-Ip: 111.22.13.3 中的 111.22.13.3 就是客户端请求的真实 IP。

输出真实 IP 到日志文件中

以 nginx 为例,如果希望将客户端真实 IP 输出到日志中,可以在 nginx 配置文件中的 log_format 中 加入 "$http_cdn_src_ip",例如下面这样:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" "$http_x_real_ip" "$http_cdn_src_ip"';

然后在对应的 vhost 的 access_log 中引用上面的 main 日志格式,其日志输出为:

183.6.210.83 - - [08/Nov/2018:09:02:04 +0800] "GET /Linux/(https://file.awen.me/img/2017/03/2008971626.png!awen_800) HTTP/1.1" "404" 2662 "http://www.fangwenjun.com/Linux/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" "-" "-" "111.22.13.3"

最后一个字段就是新加的 $http_cdn_src_ip。

在响应头中获取真实 IP

如果希望用户访问时候能够查看到该字段,则可以在对应的配置文件中添加一个响应头来传递该值,以 nginx 为例:

listen 80;

server_name www.fangwenjun.com;

index index.html index.htm;

root /www/www;

add_header Cdn-Src-IP $http_cdn_src_ip;

……

则浏览器访问时,响应头中就会带有 Cdn_Src_IP:

Cdn-Src-Ip: 111.22.13.3

Connection: keep-alive

Content-Encoding: gzip

Content-Type: text/html

Date: Thu, 08 Nov 2018 01:14:58 GMT

ETag: W/"5bbb212a-636b"

Last-Modified: Mon, 08 Oct 2018 09:19:38 GMT

Server: awen/1.0.0

Transfer-Encoding: chunked

X-Cache: MISS from cache.51cdn.com

X-Via: 1.1 dxinxzai155:2 (Cdn Cache Server V2.0), 1.1 hzhdx21:0 (Cdn Cache Server V2.0)

程序中获取真实 IP

如果希望在程序中获取该字段,不同的编程语言都有对应的获取 HTTP 头部的方法,可以查看对应语言的手册,以 PHP 为例,获取方法如下 :

$ip = $_SERVER["HTTP_CDN_SRC_IP"];

echo $ip;

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值