php curl 域名解析到指定IP -- clwu

最近承接的一個項目中,須要用在公有云阿里雲中用curl鏈接甲方的內網(私有云)的域名api.xxx.com.cn拉回用戶積分等等相關數據,方案的草圖以下,公有云和私有云之間經過專線連通。php

 

問題:api.xxx.com.cn 是私有云中的域名,解析出來的IP地址不能在外網訪問,BUT api.xxx.com.cn 居然在外網被解析到一個能夠訪問的IP,因而curl傻傻的鏈接到這個IP去了。api

需求:curl ( "https://api.xxx.com.cn/api/get_user_score")  -- 網絡包發到--> 私有云的IP,如上圖箭頭所於。安全

預想方案:指定curl 的dst host ip addr網絡

 

實踐一:靜態路由運維

改 /etc/hosts,加一條記錄curl

api.xxx.com.cn   10.23.xx.xx測試

考慮到將來server數量水平擴展時,運維人員須要作代碼部署以外的工做,而人也很容易忘記這些步驟,不採用阿里雲

 

實踐二:PHP手冊url

當前的PHP curl 的手冊中,只找到下圖中的選項能夠實現一樣的功能,但須要PHP7,而項目中使用的是PHP5.6。passspa

http://php.net/manual/en/function.curl-setopt.php

 

實踐三:thinking

 1)想起了終端下的curl命令有個 --resolve 選項能夠指定目標的IP

2)想起PHP接口的底層代碼幾乎就是和C語言代碼如出一轍,找了一下 /usr/include/curl/curl.h 文件,果真找到了,

從C言的這個宏看出,--resolve 對應的選項常量的名字是 CURLOPT_RESOLVE,找了一下PHP的curl文檔,居然沒有看到這個常量的定義 http://php.net/manual/en/function.curl-setopt.php

 

依然考慮到 PHP接口的底層代碼幾乎就是和C語言代碼如出一轍,推測這個常量在PHP中也是一樣的值,雖然PHP文檔沒有寫,但直接傳入這個常理的值應該是通的。

寫出以下實驗代碼,測試了一下,可然成功了。

 

 問題解決~

 

----------------------------------------- 補充另外一種方法 ----------------------------------------

這種方法經過有 url scheme中的hostname部分換成目標IP地址,再在http 頭部指定Host。

爲何這種方法可行?留給聰明的你去鍛鍊一下思惟。

答案Tips:考慮一下在Apach/Nginx中你是怎麼配置虛擬主機的,其中的Host部分起了什麼做用?

 

 BUT ,沒錯這是大寫,這種方法只對HTTP纔會100%成功,對於HTTPS會這樣

嗯,和證書籤名裏的host name不匹配,就是這麼絕情,這麼安全 -->

相關文章
相關標籤/搜索