可以通过浏览器查看URL,但不能使用CURL查看URL

时间:2010-08-23 20:34:07

标签: php forms curl http-status-code-404

今天,当我正在开发一个正在开发的应用程序时,我遇到了一个有趣的问题。希望有人知道为什么会发生这种情况/如何调整我的工作流程!

背景
我正在编写一个应用程序,帮助大学的学生相互联系。基本工作流程如下:

  
      
  1. 用户注册服务
  2.   
  3. 该应用程序使用CURL轮询大学目录中的名称
  4.   
  5. 将他们的联系信息存储在数据库表中
  6.   

我的测试网站是罗格斯大学目录(http://www.acs.rutgers.edu/directory) 我可以通过我的浏览器访问该服务(帖子到http://www.acs.rutgers.edu/pls/pdb_p/Pdb_Display.search_results),但如果我尝试通过CURL发布相同的信息,我会收到404错误。

注意:如果我直接从浏览器打开该网址并且不使用其表单提交数据,我会收到同样的错误。

代码:
以下是他们在目录网站上使用的代码:

<fieldset>
<legend>Search For People</legend>
<div style="width:50%;margin-left:auto;margin-right:auto;">
<form method="post" action="http://www.acs.rutgers.edu/pls/pdb_p/Pdb_Display.search_results" name="thisform" onkeyup="highlight()" onclick="highlight()">
    <p>
        <label for="p_name_last">Last Name:&nbsp;&nbsp;[Required]</label><br>
        <input tabindex="1" accesskey="L" class="required" type="text" id="p_name_last" name="p_name_last" size="25" maxlength="23">
    </p> 
    <p>
        <label for="p_name_first">First Name:&nbsp;&nbsp;[or initial]</label><br> 
        <input tabindex="2" accesskey="f" type="text" id="p_name_first" name="p_name_first" size="25" maxlength="23"> 
    </p>
    <input tabindex="3" type="submit" value="Search">&nbsp;&nbsp;
</form>
</div>

以下是我用来CURL服务的代码:

<?php
$p_name_last = "doe";
$p_name_first = "";
$curlPost = 'p_name_last='  . urlencode($p_name_last) . '&p_name_first=' . urlencode($p_name_first) . '&SUBMIT=Search';
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.acs.rutgers.edu/pls/pdb_p/Pdb_Display.search_results');
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 
if( ! $result = curl_exec($ch)) 
{ 
    trigger_error(curl_error($ch)); 
} 
curl_close($ch); 
echo "<pre>";
print_r($result); 
?>

任何想法或建议将不胜感激!

谢谢,
麦克

4 个答案:

答案 0 :(得分:3)

Web服务器可以选择处理请求后要发送的响应。这就是你看到404的原因 - 那里有一个资源,但它的反应却不直观。

无论如何,我可以将curl发布到此页面并获得回复;

curl http://www.acs.rutgers.edu/pls/pdb_p/Pdb_Display.search_results --data-urlencode p_name_last=test --data-urlencode p_name_first=test

如果我使用您的SUBMIT = ... param发布,我会得到一个404.仅使用两个名称参数进行尝试。


更新:实际上,只要第一个名称参数存在,您就可以只发送姓氏参数 - 第一个名称参数可以为空。

答案 1 :(得分:1)

问题似乎是表单的输入元素

<input tabindex="3" type="submit" value="Search">

不包含名称属性,因此不会以SUBMIT=search形式在POST数据中发送,或者根据http://www.w3schools.com/tags/att_input_name.asp,至少它不应该是

&#34;只有具有name属性的表单元素才会在提交表单时传递其值。&#34;

我认为您的尝试产生了404响应,因为接受您请求的脚本从不期望SUBMIT变量,这就是接受解决方案有效的原因。

答案 2 :(得分:0)

检查您的浏览器代理设置。 我有同样的问题。原来是我的代理设置导致的,该设置将请求定向到代理服务器。

答案 3 :(得分:-1)

确实页面http://www.acs.rutgers.edu/pls/pdb_p/Pdb_Display.search_results不存在。 您已重定向到新地址:http://eas.rutgers.edu,浏览器可以遵循重定向,但CURL可能有问题。

您尝试访问的网页已移动!

新地址:http://eas.rutgers.edu

请记住更新书签。

此页面将在10秒后自动重定向。 如果重定向失败,请点击http://eas.rutgers.edu继续。

您尝试访问的网页已移动!

新地址:http://eas.rutgers.edu

请记住更新书签。

此页面将在10秒后自动重定向。 如果重定向失败,请点击http://eas.rutgers.edu继续。