web-dev-qa-db-ja.com

pathinfoに部分的にURIエンコードされたURLが含まれている場合、Apacheは404を返します

(うわー、そのタイトルはひどいです...コメントで提案をするか、より良いものがあればそれを編集してください。)

私は、pathinfoとしてURLを受け取り、ユーザーのIPアドレスをチェックし、そのURLに直接移動するか(組織内にある場合)、プロキシ経由でURLに送信するようにリダイレクトするCGIプログラムを備えたサーバーを持っています。 (外部の場合)。 CGI自体はうまく機能しますが、Apacheがスクリプトを呼び出す代わりに404 NotFoundエラーを返すURLがいくつかあります。これは、URIエンコードされたパスを含むリンク先URLに関連しているようです。例えば。、

http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007%2F3-540-28519-9_8

404を返しますが、

http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007/3-540-28519-9_8

(同じURLですが、_%2F_が_/_にデコードされています)は正しく機能します。

(起動時に_error_log_に出力することにより)404が返されたときに、ipchkスクリプトがまったく開始されていないことを確認しました。これらのエラーは間違いなくApache自体に起因するものであり、ユーザーを存在しないURLにリダイレクトするスクリプトに起因するものではありません。

Pathinfo-URLのエンコーディングがipchkスクリプトを見つけるApacheの機能に影響を与えるのはなぜですか?それを渡すために何をする必要がありますかall_/cgi-bin/ipchk/_ ipchkへのURIは、何が続くかに関係なく?

2
Dave Sherohman

着信パスをチェックする前にデータを適切にデコードしないCGIコードからユーザーを保護する試みの一環として、ApacheはURIエンコードされた形式のスラッシュ(%2F)またはバックスラッシュを含むURLを拒否します(404 Not foundとして) (%5C)、説明されているように この記事で

このチェックをバイパスするには、Apache 2.0.46以降を使用し、Apache構成で AllowEncodedSlashes ディレクティブを有効にする必要があります。 (このディレクティブはnot.htaccessからは機能しません。サーバーまたは仮想ホストコンテキストでのみ許可されます。)

5
Dave Sherohman