如何在没有PHP扩展的情况下检查文件是否存在?

时间:2010-02-08 20:15:57

标签: php file-exists

我不想在链接中指定“.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");


?>

4 个答案:

答案 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)

使用PHP的glob函数来防止指定.php扩展名。但是,这可能会导致安全问题:

http://ar2.php.net/glob

glob($file . ".*")

答案 2 :(得分:0)

尝试使用url重写,将其添加到.htaccess文件中:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^/(([^/]+/)*[^.]+)$ /$1.php [L]

答案 3 :(得分:0)

使用:

$file = dirname(__FILE__).'/../relativepathfromcurrentscript/'.$_GET['file'].'.php';