Php 当参数包含在相对url中时,文件\u获取\u内容不起作用

Php 当参数包含在相对url中时,文件\u获取\u内容不起作用,php,file-get-contents,Php,File Get Contents,我正在尝试创建一个简单的web服务,它将根据传递的参数给出结果 我想使用文件获取内容,但很难让它正常工作。我已经研究了许多与文件获取内容相关的其他问题,但没有一个问题与我所面临的情况完全相同 我有一个网页: example.com/xdirectory/index.php 我尝试使用以下方法获取该页面的输出值: 文件获取内容(urlencode('https://www.example.com/xdirectory/index.php'));* 由于https的某些问题,这不起作用。由于请求页面

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

我想使用
文件获取内容
,但很难让它正常工作。我已经研究了许多与
文件获取内容相关的其他问题,但没有一个问题与我所面临的情况完全相同

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

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

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

确实有效,并按预期检索页面的html输出

现在,如果我尝试:
文件获取内容(urlencode('../xdirectory/index.php?id=100')

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

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

[Fri Dec 04 12:22:54 2015][error][client 10.50.0.12]PHP警告:文件获取内容(../xdirectory/index.PHP?id=100):无法打开流:第40行的/var/www/html/inventory/index.PHP中没有此类文件或目录,请参考:

php.ini具有以下设置:

在本地和主机上允许url打开

允许在本地和主机上包含url

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

补充说明:

  • 我尝试过使用urlencode而不是urlencode。另外,我不尝试检索文件,而是根据传递的参数动态创建html输出(就像index.php中的html输出是动态创建的一样)
**有几个人给了我各种各样的好建议,有人建议我必须使用完整的绝对路径。我刚刚完成了一个实验,使用file_get_内容来获取,这很有效,然后使用一个urlencoded参数()。。。这也奏效了。
当我尝试安全方面的事情时,它失败了,日志中的错误消息与我在其他查询中收到的错误消息相同

因此,现在我有一个改进的问题,我可能需要更新问题标题以反映它


有人知道如何获取参数化的相对url来处理文件内容吗?(即
'file\u get\u contents(urlencode('../xdirectory/index.php?id='.urlencode('100'));

除非您提供完整的绝对
protocol://host/path
-键入url至
文件获取内容
,它将假定您处理的是本地文件系统路径

这意味着您的urlencode()版本有误

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

而且您不太可能有一个名为
。%2fect…

的隐藏文件,请使用域调用url,尝试以下操作

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

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

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

要实现这一点,我将使用以下模式: ob\u start->设置变量,包括使用变量的文件->ob\u get\u contents->ob\u end\u clean

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

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

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

编辑2: 嗯,废话我上次说的。我会检查您是否可以使用argv

传递给脚本的参数的“argv”数组。当脚本在命令行上运行时,这将提供对命令行参数的C风格访问。当通过GET方法调用时,它将包含查询字符串

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

通过阅读您的评论和附加说明,我认为您不希望
文件获取内容
,但希望
包含

这些答案中有几个给了你有用的指针,告诉你你想要达到什么样的目标

file\u get\u 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,

试图将
$\u GET
值合并到index.php页面中,上面的方法让人感觉不舒服,但是如果您可以编辑index.php页面,您可以使用普通的php传递值,还可以使用特定的
return$输出返回输出语句

file_get_contents('):您的
。/
是一个相对路径,您应该使用一个绝对路径,如果它位于同一个域上,您根本不需要获取URL,只需使用
$服务器['DOCUMENT_ROOT']./文件夹/地址来调用该文件即可。另外,您不需要
urlencode
,因为该函数用于停止将字符串作为URL处理,但您确实需要此地址t