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

ファイルが現在の作業ディレクトリにある場合(これからはこれをcwdと略記します)、例は問題なく機能するはずです(EDIT 2に従って前の例を再度削除しました)。

編集
申し訳ありませんが、私は何を考えていました。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

.php 拡張子を指定しないようにするには、PHP の glob 関数を使用します。ただし、これによりセキュリティ上の問題が発生する可能性があります。

http://ar2.php.net/glob

glob($file . ".*")
于 2010-02-08T20:19:40.100 に答える
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 に答える