我正在尝试使用以下代码通过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等价物,也许这就是解决方案。赏金仍然适用于任何能够为我解决这个问题的人:)
此致
答案 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通常会发出特定的警告。