【问题标题】:cURL, php request_headers from Apache2.2 to Oracle App ServercURL, php request_headers 从 Apache2.2 到 Oracle App Server
【发布时间】:2012-01-18 21:07:59
【问题描述】:

我已经在这个问题上敲了很久。我希望有人能帮我解决这个问题。我不确定我的问题是由 cURL、php、Apache、Oracle 还是脑放屁引起的。

我正在尝试发布到 Oracle 服务器上的表单。手动,我可以制作一个类似于 GET 的 url,它会显示正确的页面。我想做 POST 来隐藏变量(可能有很多变量),因为原始表单的方法是 POST。无论哪种方式,我都无法通过我的 php/cURL 程序获得响应。

我的具体问题:

  • 显而易见的,为什么它不起作用?
  • 为什么我可以手动而不是程序来完成请求?
  • 为什么 access.log 里面有一个 GET?
  • 为什么我的请求标头被重写以包含 Oracle 服务器的 /DAD/scheme/app?
  • 我的编程自我会不会一样?

这是我当前的代码:

*<?php

$error_dump = 'stderr.txt';
$error_dump_handle = fopen($error_dump,'a');
$ch = curl_init();
$url = 'http://www2.blah.com/pls/blah/blah.blaQuery';
$url_enc_fields = array(
    'LAST_NAME'  => 'MacBlahBlah',            
    'FIRST_NAME' => 'Blahberina',          
    'CONTAINS' => 'Y',
        ... and more fields ...
    );              
$url_enc_fields = http_build_query($url_enc_fields);

//$url = $url.'?'.$url_enc_fields;  //previous GET attempt
$content_length = strlen($url_enc_fields);// number of bytes
$content_length = 'Content-Length:' . $content_length;
$headers = array(
    'Request: POST ' . $url_enc_fields . 'HTTP/1.1',  //An attempt to force the request
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded',
    'Referer:http://blah.com/pls/blah/blah.startup?code1=MM&code2=bleep',               
    'Expect: ',
    $content_length
    );

curl_setopt($ch,CURLOPT_HEADER,1); 
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLINFO_HEADER_OUT,TRUE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,FALSE); 
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);  // one of many guesses
curl_setopt($ch,CURLOPT_FRESH_CONNECT,TRUE);
// NOTE: no cookies or passwords involved             
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,180);
curl_setopt($ch,CURLOPT_TIMEOUT,180);

curl_setopt($ch,CURLOPT_VERBOSE,TRUE);
curl_setopt($ch,CURLOPT_STDERR,$error_dump_handle);
curl_setopt($ch,CURLOPT_ENCODING,'chunked'); // Added because the response was chunked, no difference
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,TRUE); // Apparently futile
curl_setopt($ch,CURLOPT_POSTFIELDS,$url_enc_fields);             
$postResult = curl_exec($ch);
$info = curl_getinfo($ch);   
$pretty_info = print_r($info,true);

> echo '<br/><pre>'; print_r($info); print_r($url_enc_fields);
> print_r($headers);

echo '</pre>';
$now_time = getdate();$format = '-------------- %f -----------';
fprintf($error_dump_handle,$format,$now_time[0]);
fprintf($error_dump_handle,$pretty_info);   
fprintf($error_dump_handle,curl_error($ch));    
fclose($error_dump_handle); 
curl_close($ch); 
?>*                                              

------------ 这是当前的记录 -------------

来自我的错误转储:

-------------- 1323725891.000000 -----------Array
(
    [url] => http://www2.blah.com/pls/blah/blah.blaQuery
    [content_type] => text/html; charset=iso-8859-1
    [http_code] => 404
    [header_size] => 205
    [request_size] => 601
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.203
    [namelookup_time] => 0
    [connect_time] => 0.078
    [pretransfer_time] => 0.078
    [size_upload] => 146
    [size_download] => 336
    [speed_download] => 1655
    [speed_upload] => 719
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 0.203
    [redirect_time] => 0
    **[request_header] => POST /pls/blah/blah.blaQuery HTTP/1.1**
Host: blah.com
Accept-Encoding: chunked
Request: POST LAST_NAME=MacBlahBlah&FIRST_NAME=Blahberina&CONTAINS=Y&...some other fields... HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Referer:http://blah.com/pls/wllpub/blah.startup?code1=MM&code2=bleep
Content-Length:146

来自我的 Apache access.log:

*##.##.##.## - - [12/Dec/2011:14:38:06 -0700] "GET /cgi-bin/mydir/mysubmit_form.php HTTP/1.1" 200 2698 "-" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"*

为什么要执行 GET?

返回的 HTML 代码:

http://www2.blah.com/pls/blah/blah.blaQuery
HTTP/1.1 404 Not Found
Date: Mon, 12 Dec 2011 22:03:53 GMT
Server: Oracle-Application-Server-10g/10.1.2.2.0 Oracle-HTTP-Server
Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1
Not Found
The requested URL pls/blah/blah.blaQuery was not found on this server.

Oracle-Application-Server-10g/10.1.2.2.0 Oracle-HTTP-Server Server at www2 Port 80

【问题讨论】:

    标签: php oracle apache curl


    【解决方案1】:

    试试

    $fields = array(
        'LAST_NAME'  => 'MacBlahBlah',            
        'FIRST_NAME' => 'Blahberina',          
        'CONTAINS' => 'Y',
            ... and more fields ...
        );              
    $url_enc_fields = http_build_query($fields);
    

    然后

    curl_setopt($ch,CURLOPT_POST,count($fields)); // Apparently futile
    curl_setopt($ch,CURLOPT_POSTFIELDS,$url_enc_fields);
    

    我没有检查这些更改,但我通常是这样做的

    【讨论】:

    • 嘿 A.B.,感谢您查看此内容。我进行了更改以分隔数组版本($fields)和字符串版本($url_enc_fields)。我确实更喜欢它,因为它们确实提供两种不同的功能,而从技术上讲,其中一种是用词不当。不幸的是,这并没有改变结果。我认为这是因为 CURLOPT_POST 只需要一个布尔运算符。 count() 将是 TRUE 因为它不为零,但遗憾的是没有击败程序/应用程序/网络服务器提交。还有其他想法吗?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2023-04-09
    • 1970-01-01
    • 2015-04-17
    • 2015-08-24
    相关资源
    最近更新 更多