web-dev-qa-db-ja.com

URLでURLをエンコードする-Apache mod-proxy(ProxyPass)

ProxyPassを次のように構成しています:サーバーで、ポート7777でリッスンするRest-APIを提供するサービスを開始します。クライアント側から、このAPIを次のように呼び出せるようにしたいと思います:http://example.org/servicename/PARAMETER

このAPIへの完全な呼び出しは次のようになります。HTTPPUT @ http://example.org/servicename/PARAMETERPARAMETERは文字列です)。内部的には、次のURLに変換されます:http://server.ip:7777/servicename/PARAMETER

PARAMETERが次のようになっていない限り、すべてが期待どおりに機能します(!):http://parameter.org(実際には、URLエンコードする必要があります:http%3A%2F%2Fparameter.org)。つまり、全体として、呼び出しはhttp://example.org/servicename/http%3A%2F%2Fparameter.orgです。

パラメータのhttp://は、Apacheを混乱させ、呼び出しへの応答で次のエラーメッセージを表示します。

!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /servicename/http://parameter.org was not found on this server.</p>
<hr>
<address>Apache/2.2.22 (Debian) Server at example.org Port 80</address>
</body></html>

たとえば、http%3A%2F%2Fparameter.orgtestに置き換えると、すべてが正常に機能します。どういうわけか、パラメータのhttp://はApacheを混乱させます。 Apacheに無視させる方法はありますか?

このvhostの現在の構成は次のようになります。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/example
        ServerName example.org
        ErrorLog /var/log/Apache2/example_error.log
        LogLevel warn
        CustomLog /var/log/Apache2/example_access.log combined

    <IfModule mod_proxy.c>
        ProxyRequests Off

        ProxyPass / http://localhost:7777/
        ProxyPassReverse / http://localhost:7777/
    </IfModule>
</VirtualHost>

前提条件:

  • APIの動作を変更できません。それはサードパーティです。
  • パラメータとしてURLを提供できるようにする必要があります。

編集1:

tail -f /var/log/Apache2/example_access.log利回り

128.xxx.xxx.xxx - - [19/Aug/2015:16:53:17 +0200] "PUT /servicename/http%3A%2F%2Fparameter.org HTTP/1.1" 404 521 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36"
3
beta

デフォルトのApache設定では、 AllowEncodedSlashes ディレクティブはoffに設定されています。これは、「... AllowEncodedSlashesディレクティブにより、エンコードされたパス区切り文字[...]を含むURLをパス情報で使用できるようになります。デフォルトでは値、オフ、そのようなURLは404(見つかりません)エラーで拒否されます... "

したがって、問題は、Apacheが(404を使用して)拒否しているため、mod_proxyがURLベースのPOSTリクエストをプロキシしているではないことです。 mod_proxyがアクションを実行する前。

別の考えられる問題は、URLエンコードプロセスに関連しています。Apache(フロントエンド)は、適切にURLエンコードされた文字列(送信する文字列:http: //example.org/servicename/http%3A%2F%2Fparameter.org)と私はそれ(Apache)が関連するPOSTリクエストを内部処理している間にURLデコードすることを期待しています。したがって、Apache内のmod_proxyが実際のURL(エンコードされていない)を受信することを期待しており、プロキシー中に、URLエンコードされたサイクルを実行するのではないかと思います。 公式のProxyPassのドキュメント 表示:「通常、mod_proxyはProxyPassedのURLを正規化します。ただし、これは一部のバックエンド、特にPATH_INFOを使用するバックエンドと互換性がない場合があります。オプションnocanonキーワードはこれを抑制し、URLパス「raw」をバックエンドに渡します。このキーワードは、プロキシによって提供されるURLベースの攻撃に対する通常の限定的な保護を削除するため、バックエンドのセキュリティに影響を与える可能性があることに注意してください "なので、「nocanon」オプションの使用法も評価する必要があります。

両方の問題(AllowEncodedSlashesおよびnocanon)が this StackOverflow question で言及されています

8

http://では/がディレクトリセパレータとして引き続き表示されるため、この動作があると思います。したがって、あなたはフォルダparamater.orgの下でリソースhttp:を探しています(フォルダによって、実際のフォルダを意味しているわけではありません。アクセスパスである可能性があるためですが、ポイントを取得できます)。

URLのリソースに/と入力することはできないので、%2Fを使用する必要があります

0
axellink