我们有个类微博应用
背景:测试员说其发表内容中链接应该是可点击的短链接
简单调试发现:在本地和服务器上都能获取到链接的短地址,唯独内网的测试地址: 192.168.1.111:81/app
不能获取短地址,
思考原因,获取短地址的流程是 匹配内容中的url,然后调用google的短址api,
首先我没有匹配出带端口号的url,没有匹配出localhost的url
就想偷懒直接匹配出以(http://|https://|ftp://)开头,至空格,引号(',",‘,“,等隔断符,包含汉字等)的部分作为长地址的。
这个再说。
其次改了匹配正则后,依旧不能获取短地址,而本地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下是不是都有这个问题?