如何检查文件是不是存在没有PHP中的扩展名?

Posted

技术标签:

【中文标题】如何检查文件是不是存在没有PHP中的扩展名?【英文标题】:How to check if file exists without the extension in PHP?如何检查文件是否存在没有PHP中的扩展名? 【发布时间】:2011-01-14 12:53:58 【问题描述】:

我不想在链接中指定“.php”文件扩展名。但是当我这样做时,我无法成功检查链接中指定的文件是否存在。这是因为 PHP 内置的“file_exists”函数考虑了 .php 扩展名。即使这样也行不通:

file_exists($file.".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");


?>

【问题讨论】:

假设 "$file.php" 在 include_path 中可用或与运行脚本位于同一目录中,您的代码应该可以工作。 【参考方案1】:

您的示例应该可以正常工作(我按照 EDIT 2 再次取消了前一个),前提是该文件位于当前工作目录中(从现在开始我将其缩写为 cwd )。

编辑抱歉,我在想什么。您的示例当然不起作用,因为应该为 file_exists() 提供文件的完整路径。因此,在文件前面加上要从目录中提取文件的目录。尽管如此,我关于清理和白名单等的警告仍然很重要。END EDIT

编辑 2 哇,对不起,我搞砸了。 file_exists() 应该适用于相对路径。 Looking at the documentation,但是它确实警告安全模式限制。也许这些适用于你的情况,我不知道。END EDIT 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' );

【讨论】:

你确定吗?我刚刚在本地测试了 file_exists() 并且它在没有完整路径的情况下工作。 @Kevin:是的,这是我的失误,抱歉。我自己也测试过,确实有效。无论如何,感谢您指出。 “老兄”、“小妞”、“妈妈”。听起来像是一场派对。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

http://ar2.php.net/glob

glob($file . ".*")

【讨论】:

【参考方案4】:

使用:

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

【讨论】:

以上是关于如何检查文件是不是存在没有PHP中的扩展名?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查php中是不是存在mcrypt扩展

检查文件在php中是不是存在正则表达式[重复]

PHP - 在不知道扩展名的情况下检查文件是不是存在

检查xml(没有文件扩展名)是不是存在的最佳方法

检查文件 mime 类型是不是与 php 中的扩展名匹配

如何检查目录中是不是存在扩展名为 .txt 的文件?