Как проверить, существует ли файл без расширения в PHP? - PullRequest
0 голосов
/ 08 февраля 2010

Я не хочу указывать расширение ".php" в ссылке. Но когда я делаю это, я не могу успешно проверить, существует ли файл, указанный в ссылке, или нет. Это связано с тем, что встроенная в PHP функция file_exists учитывает расширение .php. И даже это не работает:

file_exists ($ файл. "PHP.");

В любом случае, есть ли способ заставить следующую работу работать без указания расширения php в ссылках html:

<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 голосов
/ 08 февраля 2010

Ваш пример должен работать очень хорошо ( Я снова разметил предыдущий файл согласно EDIT 2 ), при условии, что файл находится в текущем рабочем каталоге (теперь я просто сокращу его до cwd) .

EDIT
Извините, что я думал. Ваш пример, конечно, не работает, потому что file_exists() должен быть указан полный путь к файлу. Поэтому добавьте файл с каталогом, который вы хотите вытащить из каталога. Тем не менее, мое предупреждение о санитарной обработке, внесении в белый список и т. Д. Все еще имеет значение.
КОНЕЦ РЕДАКТИРОВАНИЯ

РЕДАКТИРОВАТЬ 2
Вау, извини, я все испортила. file_exists() должно отлично работать с относительными путями. Глядя на документацию , он предупреждает об ограничениях безопасного режима. Может быть, это относится к вашей ситуации, я не знаю.
END EDIT 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' );
}
0 голосов
/ 09 февраля 2010

использование:

$file = dirname(__FILE__).'/../relativepathfromcurrentscript/'.$_GET['file'].'.php';
0 голосов
/ 08 февраля 2010

Попробуйте переписать URL, добавьте это в ваш файл .htaccess:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^/(([^/]+/)*[^.]+)$ /$1.php [L]
0 голосов
/ 08 февраля 2010

Используйте функцию glob в PHP, чтобы не указывать расширение .php. Однако это может привести к проблеме безопасности:

http://ar2.php.net/glob

glob($file . ".*")
...