0

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


?>
4

4 回答 4

4

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

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

编辑 2
哇,对不起,我搞砸了。file_exists()使用相对路径应该可以正常工作。查看文档,它确实警告安全模式限制。也许这些适用于你的情况,我不知道。
结束编辑 2

您可以使用 测试 cwd 是什么getcwd()。通常情况下,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' );
}
于 2010-02-08T20:34:11.500 回答
0

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

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^/(([^/]+/)*[^.]+)$ /$1.php [L]
于 2010-02-08T20:23:08.843 回答
0

利用 :

$file = dirname(__FILE__).'/../relativepathfromcurrentscript/'.$_GET['file'].'.php';
于 2010-02-08T21:05:14.063 回答
0

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

http://ar2.php.net/glob

glob($file . ".*")
于 2010-02-08T20:19:40.100 回答