2010-02-08 7 views
0

Je ne souhaite pas spécifier l'extension de fichier ".php" dans le lien. Mais quand je fais cela, je ne peux pas vérifier avec succès pour voir si le fichier spécifié dans le lien existe ou non. C'est parce que la fonction "file_exists" de PHP prend en compte l'extension .php. Et même cela ne fonctionne pas:Comment vérifier si le fichier existe sans l'extension en PHP?

file_exists ($ fichier. ". Php");

Quoi qu'il en soit, il est un moyen de faire les travaux suivants sans speciding l'extension php dans les liens html:

<a href="?file=dude">Some File</a> 

<?php 

$file = $_GET['file']; 

if(file_exists($file.".php")) 
{ 
    include($file.".php"); 
} 
else 
    include("404.php"); 


?> 
+1

En supposant "file.php $" est disponible dans le include_path ou existe dans le même répertoire que le script en cours d'exécution, votre code devrait fonctionner. – Kevin

Répondre

0

Utilisez la fonction glob de PHP pour éviter spécifier l'extension .php. Cependant, cela peut entraîner un problème de sécurité:

http://ar2.php.net/glob

glob($file . ".*") 
0

Essayez avec rewrite url, ajoutez à votre fichier .htaccess:

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

Votre exemple devrait fonctionner très bien (I désempare le précédent selon EDIT 2), à condition que le fichier se trouve dans le répertoire de travail courant (je vais simplement l'abréger en cwd à partir de maintenant).

EDIT
Désolé, ce que je pensais. Votre exemple ne fonctionne pas bien sûr, car file_exists() doit être fourni avec le chemin d'accès complet au fichier. Donc préfixez le fichier avec le répertoire dans lequel vous voulez sortir les fichiers du répertoire. Mon avertissement au sujet de la sanatizing et de la liste blanche, etc. compte quand même quand même.
FIN EDIT

EDIT 2
Wow, désolé, je suis chambouler bigtime. file_exists() devrait fonctionner très bien avec les chemins relatifs. Looking at the documentation, il avertit cependant sur les restrictions de mode sans échec. Peut-être que cela s'applique à votre situation, je ne sais pas.
FIN EDIT 2

Vous pouvez tester ce qui est le CWD avec getcwd(). Dans des circonstances normales, le cwd est le même que le point d'entrée de votre application. Donc, si par exemple /usr/www/your_site_root/index.php est le point d'entrée, alors /usr/www/your_site_root/ est le cwd. Par conséquent, les fichiers que vous essayez d'inclure avec vos exemples doivent se trouver dans le répertoire en question. Un conseil:
Vous le savez peut-être déjà, mais votre exemple n'est pas très sécurisé. Vous ne désinfectez pas l'entrée de l'utilisateur de quelque façon que ce soit ($_GET[ 'file' ] dans ce cas). De cette façon, le visiteur sera en mesure d'inclure toutes sortes de fichiers php avec des résultats indésirables. Par conséquent, je vous conseille de conserver une liste blanche des fichiers autorisés à être récupérés.Quelque chose comme:

<?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

+1 pour les problèmes de sécurité ici. – ceejayoz

+1

Etes-vous sûr? Je viens de tester file_exists() localement et cela fonctionne sans le chemin complet. – Kevin

+1

@Kevin: oui, c'était une erreur de ma part, désolé. Je l'ai testé moi-même aussi, et en effet cela fonctionne. Merci de l'avoir signalé de toute façon. –

0

utilisation:

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