当参数包含在相对url中时,file_get_contents不起作用


file_get_contents not working when parameters included in a relative url

我正在尝试创建一个简单的web服务,它将根据传递的参数给出结果。

我想使用file_get_contents,但很难让它发挥作用。我研究了许多与file_get_contents问题有关的其他问题,但没有一个是我所面临的情况。

我有一个网页:example.com/xdirectory/index.php

我正试图使用以下方法获取该页面的输出值:file_get_contents(urlencode('https://www.example.com/xdirectory/index.php'));*

由于https的一些问题,这不起作用。由于请求页面和目标都在同一服务器上,我使用相对路径重试:file_get_contents(urlencode('../xdirectory/index.php'));

执行工作,并按预期检索页面的html输出。

现在,如果我尝试:file_get_contents(urlencode('../xdirectory/index.php?id=100'));

html输出是(应该是):Hello World。

命令检索到的结果为空。我检查了错误日志,发现了一个错误:

〔2015年12月4日星期五12:22:54〕〔error〕〔client 10.50.0.12〕PHP警告:file_get_contents(../xdirectory/index.PHP?id=100):无法打开流:在第40行的/var/www/html/inventory/index.PHP中没有这样的文件或目录,referer:https://www.example.com/inventory/index.php

php.ini有以下设置:

allow_url_fopen,在本地和主上

allow_url_include,在本地和主上

由于我可以只使用url而不使用参数来正确获取内容,我猜测参数和file_get_contents存在问题。我在文档中找不到任何反对使用参数的通知,所以我不知所措,请求您的帮助。

附加说明:

  • 我已经尝试过使用urlencode和不使用urlenode。此外,我并不试图检索文件,而是根据传递的参数动态创建html输出(就像index.php中的大部分html输出是动态创建的一样)

**有几个人给了我各种各样的好建议,有人建议我必须使用全面的绝对路径。我刚刚完成了一个实验,使用file_get_contentshttp://www.duckduckgo.com,起作用,然后使用urlended参数(http://www.duckduckgo.com/?q=php+is+cool)。。。这也起到了作用
当我尝试安全的时候,https://www.duckduckgo.com它失败了,并且日志中出现了与我在其他查询中收到的错误消息相同的错误消息。

所以,现在我有一个精炼的问题,我可能需要更新问题标题来反映它。

有人知道如何获得参数化的相对url来使用file_get_contents吗?(即'file_get_contents(urlencode('../xdirectory/index.php?id=' . urlencode('100')));

除非您为file_get_contents提供一个完整的绝对protocol://host/path类型url,否则它将假设您正在处理一个本地文件系统路径。

这意味着你的urlencode()版本错误地执行

file_get_contents('..%2Fxdirectory%2Findex.php');

并且您极不可能拥有名为..%2Fetc...的隐藏文件。

用域调用url,尝试这个

file_get_contents('https://www.example.com/inventory/index.php?id=100');

阅读您的评论和其他注释后,我认为您不想要file_get_contents,但想要include

请参阅如何在变量中执行和获取.php文件的内容?

其中的几个答案可以为你提供有用的指导,让你了解你想要实现的目标。

file_get_contents将返回文件的内容,而不是文件的输出,除非它是URL,但正如您在传递URI时似乎有其他问题一样。。。。

所以;你可以构建这样的东西:

$_GET['id'] = 100;
//this will pass the variable into the index.php file to use as if it was 
// a GET value passed in the URI. 
$output = include $_SERVER['DOCUMENT_ROOT']."/file/address/index.php";
unset($_GET['id']);
//$output holds the HTML code as a string,

上面的内容在尝试将$_GET值合并到index.php页面时感觉很麻烦,但如果您可以编辑index.php页面,则可以使用简单的php传递值,并在所包含的文件末尾返回特定return $output;语句的输出。

我使用PHP已经两年了,所以我只是在猜测在您的情况下我可能会尝试什么。

我可能会尝试直接在php脚本中设置变量,然后将其包括在内(如果您使用的框架允许的话),而不是尝试将参数作为查询字符串来获取解析后的文件内容。

为了实现这一点,我将使用以下模式:ob_start->设置变量,包括使用变量的文件->ob_get_contents->ob_end_clean

这就像打开您的终端并运行带有参数的php文件。

无论如何,如果有更好的方法来实现同样的结果,我不会感到惊讶。快乐黑客:o)

编辑:我想强调的是,我只是在猜测。我不知道这种方法是否存在任何安全问题。你当然可以问一下,看看是否有人知道这里的stackoverflow。

第2版:嗯,放弃我上次说的。我想检查一下你是否可以使用argv。

"argv"传递给脚本的参数数组。当脚本在命令行上运行时,这将允许C样式访问命令行参数。当通过GET方法调用时,它将包含查询字符串。http://php.net/manual/en/reserved.variables.server.php

然后您只需在本地调用php脚本,但没有查询标记指示符"?"。通过这种方式,您可以在没有服务器的情况下使用php解释器。这可能是最通用的解决方案,因为如果我正确理解手册,您也可以对get请求使用argv。