如何检查文件是不是存在没有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 )。
编辑抱歉,我在想什么。您的示例当然不起作用,因为应该为 END EDITfile_exists()
提供文件的完整路径。因此,在文件前面加上要从目录中提取文件的目录。尽管如此,我关于清理和白名单等的警告仍然很重要。
编辑 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中的扩展名?的主要内容,如果未能解决你的问题,请参考以下文章