77

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

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

URL をエンコードする必要があることは認識していますが、これは行ってい404ますが、アプリではなくサーバーからエラーが返されます。私の問題はApacheにあり、AllowEncodedSlashes Onディレクティブで修正できると思います。

httpd.conf の一番下にディレクティブを配置しようとしましたが、効果がありませんでした。次に何をすべきかわかりません。正しい場所に置いていますか?もしそうなら、他の解決策はありますか?

4

7 に答える 7

107

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

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

/example/例:から別のサーバーへのプロキシ リクエスト。

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

問題 1: Apache は無効な URL であると認識しています

解決策: AllowEncodedSlashes Onhttpd.conf 内

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

解決策: AllowEncodedSlashes NoDecodehttpd.conf 内 (Apache 2.3.12+ が必要)

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

解決策:キーワードをhttpd.conf使用して、生の URL をプロキシ経由で渡します。ProxyPassnocanon

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

httpd.conf ファイル:

AllowEncodedSlashes NoDecode

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

参照:

于 2012-03-29T21:34:34.280 に答える
65

この問題は、Apache バグ 35256 とは関係ありません。むしろ、バグ 46830 と関係があります。AllowEncodedSlashes設定は仮想ホストによって継承されず、仮想ホストは、Ubuntu のものなど、多くのデフォルトの Apache 構成で使用されます。回避策は、コンテナー内 ( Ubuntu の場合) にAllowEncodedSlashes設定を追加することです。<VirtualHost>/etc/apache2/sites-available/default

バグ 35256 : %2FPATH_INFO でデコードされます (ドキュメントにAllowEncodedSlashesはデコードが行われないと記載されています)

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

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

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

于 2010-12-14T19:08:08.950 に答える
33

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

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

このコメントは解決策を提供します。つまり、次を使用します。

AllowEncodedSlashes NoDecode
于 2011-06-17T15:05:09.660 に答える
4

すべての手間を考慮して、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

于 2012-02-16T09:08:34.607 に答える
3

かなりのテストを行い、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

これは私たちのプロジェクトのアーキテクチャの変更を意味しますが、それは避けられないようです。あなたが解決策を見つけたことを願っています。

于 2010-12-10T22:02:08.840 に答える
0

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

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

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

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

頑張ってください(私たち二人に)!

于 2010-12-09T22:46:31.717 に答える