咱們有個類微博應用 php
背景:測試員說其發表內容中連接應該是可點擊的短連接 linux
簡單調試發現:在本地和服務器上都能獲取到連接的短地址,惟獨內網的測試地址: 192.168.1.111:81/app shell
不能獲取短地址, apache
思考緣由,獲取短地址的流程是 匹配內容中的url,而後調用google的短址api, json
首先我沒有匹配出帶端口號的url,沒有匹配出localhost的url centos
就想偷懶直接匹配出以(http://|https://|ftp://)開頭,至空格,引號(',",‘,「,等隔斷符,包含漢字等)的部分做爲長地址的。 api
這個再說。 安全
其次改了匹配正則後,依舊不能獲取短地址,而本地apache和服務器上的apache能獲取獲得,估計問題出在curl_exec上,打印出curl的錯誤信息爲」Could not resolve 谷歌api的地址「 服務器
獲取google短址的代碼網上狠多,如下爲調試代碼 網絡
function getGoogleUrl($url) { //This is the URL you want to shorten $longUrl =$url; $apiKey = googlToken($url); $postData = array('longUrl' => $longUrl, 'key' => $apiKey); $jsonData = json_encode($postData); $curlObj = curl_init(); curl_setopt($curlObj, CURLOPT_URL, 'https://www.googleapis.com/urlshortener/v1/url'); curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curlObj, CURLOPT_HEADER, 0); curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json')); curl_setopt($curlObj, CURLOPT_POST, 1); curl_setopt($curlObj, CURLOPT_POSTFIELDS, $jsonData); $shorturl = curl_exec($curlObj); if($shorturl === false){ $infor = curl_getinfo($curlObj); var_dump($infor); var_dump(curl_error($curlObj)); } return $shorturl; }
問題是不能解析谷歌的網址,覺得dns等有問題,直接在命令窗戶口中能curl url的
抓破腦袋,想到覺得是selinux 的問題,想去關閉一下,結果是selinux早已被我關了,好沒安全感。
網上搜各類關鍵字,包括http://stackoverflow.com/ 設置了各類參數,未果,依舊是不能解析
最後查到有人說81端口非默認的80端口,centos會不讓其訪問外網,是經過iptables來設置規則的就對照這改了
-A INPUT -p tcp -m state -m tcp --dport 81 --state NEW -j ACCEPT #allow 81 to curl -A OUTPUT -p tcp --sport 81 -j ACCEPT如上 以前只有input ,如今加上output 至於各類參數的意義沒有細究,說不出是啥意思。
重啓了iptables服務,短地址仍是不行,只好重啓httpd,這下貌似ok
至於到底問題在哪,還沒弄明白,但願高人解釋。
就好比你把網站放在了一個非80端口訪問,而後該應用須要去抓取網絡上的數據,在linux下是否是都有這個問題?