我正在尝试创建一个简单的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存在问题。我找不到任何反对在文档中使用参数的通知,所以我不知所措并请求你的帮助。
附加说明:
**有几个人给了我各种好的建议,有人建议我必须使用完整的绝对路径。我刚刚完成了一个实验,使用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')));
)
答案 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}}语句。