我不想在链接中指定“.php”文件扩展名。但是当我这样做时,我无法成功检查链接中指定的文件是否存在。这是因为PHP内置的“file_exists”函数考虑了.php扩展。即使这不起作用:
file_exists($文件 “PHP”);
无论如何,有没有办法在html链接中指定php扩展来进行以下工作:
<a href="?file=dude">Some File</a>
<?php
$file = $_GET['file'];
if(file_exists($file.".php"))
{
include($file.".php");
}
else
include("404.php");
?>
答案 0 :(得分:4)
您的示例应该可以正常工作(我按照EDIT 2 再次取消了前一次),前提是该文件位于当前工作目录中(我将从现在开始将其缩写为cwd) )。
修改强>
对不起,我在想什么。您的示例当然不起作用,因为 file_exists()
应该提供文件的完整路径。因此,在文件前面添加要从目录中提取文件的目录。尽管如此,我对有关Sanatizing和白名单等的警告仍然很重要。
结束编辑
编辑2
哇,对不起,我搞砸了。 file_exists()
应该可以正常使用相对路径。 Looking at the documentation,它确实警告安全模式限制。也许这些适用于你的情况,我不知道。
结束编辑2
您可以使用getcwd()
测试cwd是什么。在正常情况下,cwd与应用程序的入口点相同。因此,如果例如/usr/www/your_site_root/index.php
是入口点,则/usr/www/your_site_root/
是cwd。
因此,您尝试在示例中包含的文件应位于所述目录中。
虽然提出建议:
您可能已经意识到这一点,但您的示例并不十分安全。您不以任何方式清理用户的输入(在这种情况下为$_GET[ 'file' ]
)。通过这种方式,访问者将能够包含各种不需要的结果的php文件。
因此我建议您保留允许获取的文件的白名单。类似的东西:
<?php
$whiteList = array(
'dude',
'chick',
'mom'
);
// and just to be safe, you should probably strip stuff like ../ etc. here too.
$requestedFileBaseName = $_GET[ 'file' ];
if( !in_array( $requestedFileBaseName, $whileList ) )
{
include( '404.php' );
}
else
{
include( $requestedFileBaseName . '.php' );
}
答案 1 :(得分:0)
答案 2 :(得分:0)
尝试使用url重写,将其添加到.htaccess文件中:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^/(([^/]+/)*[^.]+)$ /$1.php [L]
答案 3 :(得分:0)
使用:
$file = dirname(__FILE__).'/../relativepathfromcurrentscript/'.$_GET['file'].'.php';