[英]“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.