簡體   English   中英

“ 400錯誤請求”為什么?

[英]“400 Bad Request” Why?

此功能是使用wxWidgets的PHP-CLI腳本的一部分,該腳本嘗試將某些字段發布到LAN上的Apache2 Web服務器上。 它總是失敗“ 400 Bad Request”,並且不輸入“ /blog/update.php”代碼。 域/主機的值(可能是此錯誤的關鍵部分)是正確的。 為什么要求不好? 所有與我一樣的問題都沒有答案。

<?php

[...]

function upload_button_clicked()
{   global $file_box, $frame, $html_box, $remote_host, $title_box, $upload_button ;
    // collect global variables
    $upload_button->Disable();
    $file = $file_box->GetValue();
    $title = $title_box->GetValue();
    $html = $html_box->GetValue();

    // open stream to server
    $messages = "";
    $server = fsockopen($remote_host, 80, $errno, $errstring, 5); 
    if(!$server) 
    {   $messages .= "Cannot connect to $remote_host: $errno $errstring\n"; 
        goto end;
    }
    $messages .= "Connected to $remote_host\n"; 
    stream_set_timeout($server, 5);

    // urlencode parameters
    $body   =   "date=" . urlencode(date('d m Y')) 
                ."&file=" . urlencode($file) 
                ."&title=" . urlencode($title) 
                ."&html=" .  urlencode($html) ;
    $body_length = strlen($body) +1;  for the "\n" to terminate

    // build POST request
    $request =  "POST /blog/update.php HTTP/1.1\n"
                ."Host: $remote_host\n"
                ."Content-Type: application/x-www-form-urlencoded\n"
                ."Content-Length: $body_length\n"
                ."\n"
                .$body."\n";


    // fwrite request to stream
    loop:
    $request_length = strlen($request);
    $bytes_written = fwrite($server, $request, $request_length);
    if($bytes_written === false)
    {   $messages .= "Writing POST to $remote_host failed";
        goto end ;
    }

    // deal with partial write
    if($bytes_written < $request_length)    // not all written
    {   $request = substr($request, $bytes_written);
        goto loop;
    }
    $messages .= "sent $file OK\n";

    // read responses to POST
    while(!feof($server))
    {   $response = fgets($server, 1024);
        $messages .= "$response\n";
    }

    // tidy up
    end:
    $report = new wxMessageDialog($frame, $messages, "Upload", wxOK|wxCENTRE);
    fclose($server);
    $upload_button->Enable();
    return ;
}

[...]

?>

終端輸出:

Connected to mydomain.com
sent /home/.../blog/contents/201710090746+title.htm OK
HTTP/1.1 400 Bad Request

Date: Sun, 08 Oct 2017 21:46:08 GMT

 Server: Apache

Content-Length: 285

Connection: close

Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>400 Bad Request</title>

</head><body>

<h1>Bad Request</h1>

<p>Your browser sent a request that this server could not understand.<br />

</p>

<hr>

<address>Apache Server at 127.0.0.1 Port 80</address>

</body></html>

嘗試

$body_length = strlen($body."\n");

發送到Apache的正文比strlen($body)稍長,因為您要在$body的末尾附加一個"\\n" 因此,至少有一個編碼器收到了400 Bad Request。

嘗試使用\\r\\n代替\\n像這樣:

$body_length = strlen($body);

// build POST request
$request =  "POST /blog/update.php HTTP/1.1\r\n"
            ."Host: $remote_host\r\n"
            ."Content-Type: application/x-www-form-urlencoded\r\n"
            ."Content-Length: $body_length\r\n"
            ."\r\n"
            .$body;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM