現在、URL内にURLを配置しようとしています。例えば:
http://example.com/url/http%3A%2F%2Fwww.url2.com
URLをエンコードする必要があることは承知していますが、これを実行しましたが、今では404
私のアプリではなくサーバーからのエラー。私の問題はApacheにあり、AllowEncodedSlashes On
ディレクティブ。
Httpd.confの一番下にディレクティブを無意味にしようとしましたが、次に何をすべきかわかりません。適切な場所に置いていますか?もしそうなら、誰か他のソリューションがありますか?
この問題は、Apacheバグ35256とは関係ありません。むしろ、バグ46830と関係があります。AllowEncodedSlashes
設定は仮想ホストに継承されず、仮想ホストは、 Ubuntu。回避策は、<VirtualHost>
コンテナ(Ubuntuでは/etc/Apache2/sites-available/default
)内にAllowEncodedSlashes
設定を追加することです。
バグ35256 :%2F
はPATH_INFOでデコードされます(AllowEncodedSlashes
へのドキュメントはデコードが行われないことを示します)
バグ468 :AllowEncodedSlashes On
がグローバルコンテキストで設定されている場合、仮想ホストに継承されません。 AllowEncodedSlashes On
コンテナごとに<VirtalHost>
を明示的に設定する必要があります。
さまざまな構成セクションがどのようにマージされるかのドキュメントには、次のように書かれています。
<VirtualHost>
セクション内のセクションは、仮想ホスト定義外の対応するセクションの後に適用されます。これにより、仮想ホストがメインサーバーの構成をオーバーライドできます。
私は別の問題のためにこの投稿に出くわし続けました。簡単に説明させてください。
私は同じスタイルの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.conf
でProxyPass
キーワードnocanon
を使用して、プロキシを介して生のURLを渡します。
ProxyPass http://anotherserver:8080/example/ nocanon
httpd.confファイル:
AllowEncodedSlashes NoDecode
<Location /example/>
ProxyPass http://anotherserver:8080/example/ nocanon
</Location>
参照:
すべての手間を考慮して、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
かなりのテストを行い、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
これは、プロジェクトのアーキテクチャの変更を意味しますが、避けられないようです。解決策を見つけてください。
置換%2F
with %252F
クライアント側。
これは、スラッシュの二重エンコード形式です。
そのため、サーバーに到達し、早期にデコードされると、%2Fにデコードされます。これはまさに必要なものです。
「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を返します
その他の見つからないエラーは、ログにこの情報を提供しません。ちょうど別の診断...
幸運を(私たち二人に)!