web-dev-qa-db-ja.com

Apacheでエンコードされたスラッシュを許可する必要がある

現在、URL内にURLを配置しようとしています。例えば:

http://example.com/url/http%3A%2F%2Fwww.url2.com

URLをエンコードする必要があることは承知していますが、これを実行しましたが、今では404私のアプリではなくサーバーからのエラー。私の問題はApacheにあり、AllowEncodedSlashes Onディレクティブ。

Httpd.confの一番下にディレクティブを無意味にしようとしましたが、次に何をすべきかわかりません。適切な場所に置いていますか?もしそうなら、誰か他のソリューションがありますか?

66
tommizzle

この問題は、Apacheバグ35256とは関係ありません。むしろ、バグ46830と関係があります。AllowEncodedSlashes設定は仮想ホストに継承されず、仮想ホストは、 Ubuntu。回避策は、<VirtualHost>コンテナ(Ubuntuでは/etc/Apache2/sites-available/default)内にAllowEncodedSlashes設定を追加することです。

バグ35256%2FはPATH_INFOでデコードされます(AllowEncodedSlashesへのドキュメントはデコードが行われないことを示します)

バグ468AllowEncodedSlashes Onがグローバルコンテキストで設定されている場合、仮想ホストに継承されません。 AllowEncodedSlashes Onコンテナごとに<VirtalHost>を明示的に設定する必要があります。

さまざまな構成セクションがどのようにマージされるかのドキュメントには、次のように書かれています。

<VirtualHost>セクション内のセクションは、仮想ホスト定義外の対応するセクションの後に適用されます。これにより、仮想ホストがメインサーバーの構成をオーバーライドできます。

56
Roger Dahl

私は別の問題のためにこの投稿に出くわし続けました。簡単に説明させてください。

私は同じスタイルのURLを持ち、それをプロキシしようとしていました。

例:/example/から別のサーバーへのプロキシ要求。

/example/http:%2F%2Fwww.someurl.com/

問題1:Apacheはそれが無効なURLであると考えています

解決策:httpd.confのAllowEncodedSlashes On

問題2:Apacheはエンコードされたスラッシュをデコードします

解決策:httpd.confのAllowEncodedSlashes NoDecode(Apache 2.3.12+が必要)

問題3:mod_proxyは%2F%252Fに変更してURLを再エンコード(二重エンコード)しようとします(例:/example/http:%252F%252Fwww.someurl.com/

解決策:httpd.confProxyPassキーワードnocanonを使用して、プロキシを介して生のURLを渡します。

ProxyPass http://anotherserver:8080/example/ nocanon

httpd.confファイル:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

参照:

76
technocrat

この問題にも多くの時間を費やしました。私はパーティーに少し遅れましたが、解決策があるようです。

このスレッド によると、Apacheにはバグがあります(AllowEncodedSlashes On、404を防止しますが、誤ってスラッシュをデコードします。これはRFCによれば正しくありません。

このコメント は、ソリューションを提供します:

AllowEncodedSlashes NoDecode
31
George Armhold

すべての手間を考慮して、base64_encodingに続いてurlencodingを選択しました。これは、Apacheサーバーの設定やバグレポートを確認することなく機能します。また、クエリセクションにURLを入力しなくても機能します。

$enc_url = urlencode(base64_encode($uri_string));

そしてそれを取り戻すために

$url = base64_decode(urldecode($enc_url));

http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz

http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D

5
Kinjal Dixit

かなりのテストを行い、Apacheのバグを見て、さまざまなフォーラムでソリューションを提供しているにもかかわらず、これはApacheの未解決の問題であると結論付けました。バグを参照してください: https://issues.Apache.org/bugzilla/show_bug.cgi?id=35256

私のために働く回避策は、エスケープされたスラッシュを含むことができるアイテムがパスの代わりにURIのクエリセクションにあるようにURIをリファクタリングすることです。私のテストでは、AllowEncodedSlashesとAcceptPathInfoの設定に関係なく、Apacheによってフィルターされないことが示されています。

そう: http://test.com/url?http%3A%2F%2Fwww.url2.com

または:http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com

の代わりに: http://test.com/url/http%3A%2F%2Fwww.url2.com

これは、プロジェクトのアーキテクチャの変更を意味しますが、避けられないようです。解決策を見つけてください。

2
abq_rob

置換%2F with %252Fクライアント側。

これは、スラッシュの二重エンコード形式です。

そのため、サーバーに到達し、早期にデコードされると、%2Fにデコードされます。これはまさに必要なものです。

0
Amy Neville

「AllowEncodedSlashes On」で同じ問題が発生し、ディレクティブをいくつかの異なる場所に配置しようとしました: http:/の例に従って、Apache2.conf、httpd.conf、セクション内/www.jampmark.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-Apache.html

まだ行っていない場合は、ログレベルをデバッグ(別のディレクティブ)に設定して、エラーが発生するかどうかを確認します。

uRI(decoded = '/ url/http://www.url2.com')に%2f(エンコードされた '/')が見つかり、404を返します

その他の見つからないエラーは、ログにこの情報を提供しません。ちょうど別の診断...

幸運を(私たち二人に)!

0
abq_rob