当参数包含在相对网址

时间:2015-12-04 18:42:58

标签: php file-get-contents

我正在尝试创建一个简单的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。

该命令检索的结果为空白。我检查错误日志并出错:

  

[Fri Dec 04 12:22:54 2015] [错误] [client 10.50.0.12] PHP警告:file_get_contents(../ xdirectory / index.php?id = 100):无法打开流:没有这样的文件或第40行/var/www/html/inventory/index.php中的目录,引用者:https://www.example.com/inventory/index.php

php.ini有这些设置:

  

allow_url_fopen,On local和On master

     

allow_url_include,On local和On master

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

附加说明:

  • 我使用urlencode尝试了这个,而不是使用urlencode。此外,我不是试图检索文件,而是根据传递的参数动态创建html输出(就像动态创建的index.php中的html输出一样)。

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

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

有没有人知道如何使用参数化的相对网址来处理file_get_contents? (即'file_get_contents(urlencode('../xdirectory/index.php?id=' . urlencode('100')));

4 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

使用域名调用网址,试试这个

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

答案 2 :(得分:0)

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

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

要实现这一点,我会使用模式: ob_start - >设置变量,包括使用变量的文件 - > ob_get_contents - > ob_end_clean

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

无论如何,如果有更好的方法可以达到相同的结果,我不会感到惊讶。快乐的黑客行为:o)

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

EDIT2: 嗯,废弃我上次说的话。我会检查你是否可以使用argv。

  

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

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

答案 3 :(得分:0)

通过阅读您的评论和其他说明,我认为您不希望file_get_contents,但您需要include

请参阅How to execute and get content of a .php file in a variable?

这些答案中的一些为您提供了有关您尝试实现的目标的有用指示。

file_get_contents将返回文件的内容而不是文件的输出,除非它是一个URL,但是你似乎还有其他问题,绝对传递URI .... / p>

因此;你可以构建类似的东西:

$_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传递值,并获得返回的特定{包含文件末尾的{1}}语句。