我正在开发一个将唯一标识符作为输入的 servlet,如果可以在另一台服务器上找到文档,则返回文档或发送 302 Moved Temporarily 重定向。另一台服务器是一个带有 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。
我的 servlet 实现从数据库(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);