我正在使用 cURL 在工作中构建一个基本的链接检查器。我的应用程序有一个名为 getHeaders() 的函数,它返回一个 HTTP header 数组:函数 getHeaders($url) { if(function_exists('curl_init')) { //创建一个新的 cURL 资源 $ch = curl_init(); //设置 URL 和其他适当的选项 $options = 数组( CURLOPT_URL => $url, CURLOPT_HEADER => 真, CURLOPT_NOBODY => 真, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_RETURNTRANSFER => true ); curl_setopt_array($ch, $options); //抓取 URL 并将其传递给浏览器 curl_exec($ch); $headers = curl_getinfo($ch); //关闭cURL资源,释放系统资源 curl_close($ch); } 别的 { echo "错误: web 服务器上没有安装 cURL。无法继续。"; 返回假; } 返回 $headers;}print_r(getHeaders('mail.google.com'));这产生以下结果:大批( [网址] => http://mail.google.com [content_type] => 文本/html;字符集=UTF-8 [http_code] => 404 [header_size] => 338 [请求大小] => 55 [文件时间] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [总时间] => 0.128 [名称查找时间] => 0.042 [连接时间] => 0.095 [pretransfer_time] => 0.097 [size_upload] => 0 [size_download] => 0 [速度下载] => 0 [speed_upload] => 0 [下载内容长度] => 0 [上传内容长度] => 0 [开始传输时间] => 0.128 [重定向时间] => 0)我已经用几个长链接对其进行了测试,并且该功能可以确认重定向,似乎除了 mail.google.com 之外。为了好玩,我将相同的 URL (mail.google.com) 传递给 W3C 链接检查器,它产生:结果链接有效链接!重定向列表下面的链接没有损坏,但文档没有使用确切的 URL,并且链接被重定向。为了速度,链接到最终位置可能是个好主意。警告行:1 http://mail.google.com/mail/重定向到https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1状态:302 -> 200 OK这是一个临时重定向。如果您认为链接有意义,请更新链接,或保持原样。 anchor 找到 0 个 anchor 。在 4.50 秒内检查了 1 个文档。这是正确的,因为上面的地址是我在浏览器中输入 mail.google.com 时重定向到的地址。我需要使用哪些 cURL 选项来使我的函数为 mail.google.com 返回 200?为什么上面的函数返回 404 状态代码而不是 302 状态代码?TIA 最佳答案 问题是重定向是通过 cURL 不会遵循的方法指定的。这是 http://mail.google.com 的回复:HTTP/1.1 200 OKCache-Control: public, max-age=604800Expires: Mon, 22 Jun 2009 14:58:18 GMTDate: Mon, 15 Jun 2009 14:58:18 GMTRefresh: 0;URL=http://mail.google.com/mail/Content-Type: text/html; charset=ISO-8859-1X-Content-Type-Options: nosniffTransfer-Encoding: chunkedServer: GFE/1.3<html> <head> <meta http-equiv="Refresh" content="0;URL=http://mail.google.com/mail/" /> </head> <body> <script type="text/javascript" language="javascript"> <!-- location.replace("http://mail.google.com/mail/") --> </script> </body></html>如您所见,该页面同时使用 Refresh header (和 HTML 元等效项)和正文中的 javascript 将位置更改为 http://mail.google.com/mail/ 。如果您随后请求 http://mail.google.com/mail/ ,您将被重定向(带有位置 header ,cURL 跟随)到您之前提到的 W3C 正确识别的页面。HTTP/1.1 302 Moved TemporarilyCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: Fri, 01 Jan 1990 00:00:00 GMTDate: Mon, 15 Jun 2009 15:07:56 GMTLocation: https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1<mpl=default<mplcache=2Content-Type: text/html; charset=UTF-8X-Content-Type-Options: nosniffTransfer-Encoding: chunkedServer: GFE/1.3HTTP/1.1 200 OKContent-Type: text/html; charset=UTF-8Cache-control: no-cache, no-storePragma: no-cacheExpires: Mon, 01-Jan-1990 00:00:00 GMTSet-Cookie: GALX=B8zH60M78Ys;Path=/accounts;SecureDate: Mon, 15 Jun 2009 15:07:56 GMTX-Content-Type-Options: nosniffContent-Length: 19939Server: GFE/2.0(HTML page content here, removed)也许您应该在脚本中添加一个额外的步骤来检查 Refresh header 。另一个可能的错误是您在 PHP 配置中设置了 open_basedir,这会禁用 CURLOPT_FOLLOWLOCATION - 您可以通过打开错误报告来快速检查这一点,因为生成的消息是警告或通知。以上结果都是通过以下cURL设置获得的:$useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_AUTOREFERER, 1);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_USERAGENT, $useragent);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$res = curl_exec($ch);curl_close($ch);关于php - 与 mail.google.com、cURL 和 http ://validator. w3.org/checklink 混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/991257/ 10-14 15:03