400错误请求 - 尝试使用外部URL上的readfile()来流式传输网络摄像头

时间:2011-07-18 10:16:19

标签: php apache

我正在尝试使用以下代码通过PHP流式传输ipcamera;

<?
# Stop apache timing out
set_time_limit(0);

# Set the correct header
header('Content-Type: multipart/x-mixed-replace;boundary=ipcamera');

# Read the images
readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/videostream.cgi');
?>

这个脚本在运行apache和php的localhost上运行得很好,但是在我的Web服务器上(在2台服务器上测试),我收到400 Bad Request错误。我以前收到“连接被拒绝”错误,但这是由我的主机转发正确的端口解决的。

400不是不正确的语法吗?这可能是因为我在网址中有“[USER]:[PASSWORD] @”吗?如果是这样,在运行readfile之前是否有其他方法可以进行身份​​验证?

我已运行以下案例来确定响应代码;

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/NONEXISTINGFILE.cgi');
// Returns 400 Bad Request (Should be 404)

readfile('http://[IPADDRESS]:[PORT]/NONEXISTINGFILE.cgi');
// Returns 404 Not Found (Correct Response)

readfile('http://[IPADDRESS]:[PORT]/videostream.cgi');
// Returns 401 Unauthorized (Correct Response)

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/videostream.cgi');
// Returns 400 Bad Request (Incorrect - Should be .. 200(?) OK)

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/FILETHATDOESEXIST.jpg');
// Returns 400 Bad Request (Should be 200(?) OK)

readfile('http://[IPADDRESS]:[PORT]/FILETHATDOESEXIST.jpg');
// Returns 200(?) OK (Correct Response)

如果有人能够给我这个脚本的curl等价物,也许这就是解决方案。赏金仍然适用于任何能够为我解决这个问题的人:)

此致

3 个答案:

答案 0 :(得分:2)

对于卷曲,尝试类似:

<?php

# Stop apache timing out
set_time_limit(0);

# Set the correct header
header('Content-Type: multipart/x-mixed-replace;boundary=ipcamera');

# Read the images
$ch = curl_init('http://[IPADDRESS]:[PORT]/videostream.cgi');
curl_setopt($ch, CURLOPT_USERPWD, '[USER]:[PASSWORD]');
curl_exec($ch);

如果要继续使用readfile(),可以使用stream_context_create()为readfile构造流上下文。请参阅this documentation on php.net以了解如何完成此操作 - 具体而言,您将需要创建一个传递Authentication头的HTTP流上下文。

答案 1 :(得分:0)

只需检查您的[USER][PASSWORD] ...确保其中不包含:, /, @ ...

如果使用\

进行转义

答案 2 :(得分:0)

您可能在生产服务器上的PHP.INI中设置了一些禁用readfile加载外部URL的功能。

我特别考虑 allow_url_fopen ,可能会将其设置为FALSE,但它可能是其他内容。

您还可以检查Web服务器的错误日志以获取线索。 PHP通常会发出特定的警告。