3

PHPプロジェクトにフロントコントローラーがあります。これがコードです。

.htaccessファイル

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php [PT,L]
</IfModule>

index.phpファイル

<?php
list($url) = explode('?', $_SERVER['REQUEST_URI']);
$url = trim(trim($url), '/');

if(!file_exists('pages/'.$url.'.php')
    header('Location: 404.html');

require_once 'inc/head.php';
require_once 'pages/'.$url.'.php';
require_once 'inc/foot.php';
?>

要求されたすべてのURLはindex.phpファイルを経由する必要があると想定しました。しかし\、URLサーバーに(%5Cとして)ある場合、答えは「見つかりません」です。

質問;

  • \なぜキャラクターに例外があるのですか?そのようなキャラクターはいますか?
  • \Apacheでファイルを検索するための文字の通常の使用は何ですか?なぜ無視しないのですか?
  • Apacheはどこでファイルを検索し、見つからないのですか?

注:私のシステムは、Apache2.2.21とPHP5.3.10を搭載したWindowsです。注2:これは単なるサンプルコードであるため、より良い方法を提供しないでください。

4

1 に答える 1

2

上記のコメントはすでにそれを言った:

Windowsでは\パス区切り文字であるため、Windowsシステムでの要求は、ディレクトリであるドキュメントルート'http://localhost/\' によってキャッチされます。RewriteCond %{REQUEST_FILENAME} -d

条件d(!-d)を逆にしたので、apacheは書き換えルールを実行しませんが、存在しないデフォルトのインデックスファイルを探します。404を取得します。

「既存のディレクトリではない」という条件を削除するか、index.phpをデフォルトのリストに追加します

編集:

私が書いた物語は、私が自分で信じたほどのもっともらしい性格を持っていました:)確かに、これはWindowsではなく、Apache固有のものです。

Apacheが原因で、security leak in CGIこれは何年も前に修正として導入されました。リクエストを処理する代わりに、またはリクエストURLの404 Not Foundいずれかを渡すと、すぐにを返します。%5C (backslash)%2F (slash)

これをで再現することができましたApache 2.2.14

使用しない場合CGI(Perl Webサイトなど)、この「セキュリティ修正」を安全に無効にできます。

AllowEncodedSlashes On

これはApache2.0.46で導入されました。ドキュメントを参照してください。この変数の設定は私のでは機能しませんでした。サーバー.htaccessに配置する必要がありましたvhost configrestart the apache

于 2012-12-01T16:04:00.593 に答える