一意の識別子を入力として取り、ドキュメントを返すか、ドキュメントが別のサーバーで見つかる場合は 302 Moved Temporarily リダイレクトを送信するサーブレットに取り組んでいます。もう 1 つのサーバーは、Apache を備えた Linux ボックスであり、webdav を介してファイルを公開します。私はこのサーバーを制御できません。
URL に特殊文字 (ドイツ語のウムラウト) が含まれていない限り、リダイレクトは正常に機能します。
このhttp://webfolder.company.com/projekt/übersicht.pdf
URL をコピーしてブラウザ (Chrome) に貼り付けると、問題なくファイルを開くことができます (ウムラウトは URL に残ります)。
しかし、サーバー側からリダイレクトを送信すると、URL がエンコードされhttp://webfolder.company.com/projekt/%C3%BCbersicht.pdf
、何らかの理由で理解できないため、404 - Not Found が発生します。
私のサーブレット実装は、データベース (MySQL、UTF-8) から URL を取得し、HttpServletResponse.sendRedirect メソッドを使用します。
response.sendRedirect(remoteRessource);
(remoteRessource は文字列です)。を使用curl
すると Location ヘッダーが設定されていることがわかりますが、Chrome (および Firefox) は URL を にエンコードするhttp://webfolder.company.com/projekt/%C3%BCbersicht.pdf
ため、404 エラーが発生します。
< HTTP/1.1 302 Moved Temporarily
< Date: Wed, 06 Mar 2013 20:50:16 GMT
< Server: Apache-Coyote/1.1
< Location: http://webfolder.company.com/projekt/übersicht.pdf
< Content-Type: text/html;charset=UTF-8
< Content-Length: 0
< Set-Cookie: JSESSIONID=FA670C0DDA55593368A3285F54894153; Path=/; HttpOnly
< Vary: Accept-Encoding
エンコードされていないブラウザにリダイレクト URL をそのまま提供する適切な方法は何ですか? ありがとう。
修理
Julian Reschke の回答のおかげで、両方のサーバーで使用されているエンコーディングが異なることがわかりました。これで、Java/URI クラスがエンコーディングを処理できるようになり、問題なく動作するようになりました。
URI uri = new URI(schema, host, path, null);
String location = uri.toASCIIString();
response.sendRedirect(location);