【问题标题】:301 Moved Permanently301永久搬家
【发布时间】:2025-12-02 23:35:01
【问题描述】:

我正在尝试通过 Java 中的 URL 获取 HTML。但是301 Moved Permanently 是我所拥有的。另一个 URL 工作。怎么了?这是我的代码:

 hh= new URL("http://hh.ru");
        in = new BufferedReader(
                new InputStreamReader(hh.openStream()));


        while ((inputLine = in.readLine()) != null) {

            sb.append(inputLine).append("\n");
            str=sb.toString();//returns 301


        }

【问题讨论】:

  • 如果另一个网址有效,那么您的代码没有问题,hh.ru 是一个有效的网址吗?
  • 当我访问该 URL 时,我会收到 301 重定向。这是重定向后的代码链接:*.com/questions/1884230/…

标签: java html http http-status-code-301


【解决方案1】:

您正面临重定向到其他网址。这很正常,网站可能有很多理由重定向您。只需遵循基于“位置”HTTP 标头的重定向,如下所示:

URL hh= new URL("http://hh.ru");
URLConnection connection = hh.openConnection();
String redirect = connection.getHeaderField("Location");
if (redirect != null){
    connection = new URL(redirect).openConnection();
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
System.out.println();
while ((inputLine = in.readLine()) != null) {
    System.out.println(inputLine);
}

您的浏览器会自动跟踪重定向,但使用 URLConnection 您应该自己进行。如果它困扰您,请查看其他 Java HTTP client 实现,例如 Apache HTTP 客户端。他们中的大多数都能够自动跟随重定向。

【讨论】:

  • 但这显示了移动版的 HTML。看m.hh.ru。我要完整版。
  • 看起来版本取决于您设置的用户代理。这个在我的测试中给出了一个完整版本:connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/ 3.6.2");
  • 如果不行,下次怎么测试?我的意思是我应该使用哪种策略来修复这些参数?
  • 如果您想获取与浏览器相同的页面,则尽可能与浏览器相似:1. 遵循重定向并处理其他 HTTP 代码 2. 设置典型标头(用户代理、接受、 Referrer 等)发出请求时 3. 必要时使用 cookie 和维护身份验证
  • @Jk1 也许在考虑头字段“位置”是重定向之前先查看错误代码是个好主意,不是吗? connection.getResponseCode()?
【解决方案2】:

发现这个答案很有用,并且由于可能存在多次重定向(例如 307 然后 301)而有所改进。

URLConnection urlConnection = url.openConnection();
                String redirect = urlConnection.getHeaderField("Location");
                for (int i = 0; i < MAX_REDIRECTS ; i++) {
                    if (redirect != null) {
                        urlConnection = new URL(redirect).openConnection();
                        redirect = urlConnection.getHeaderField("Location");
                    } else {
                        break;
                    }
                }

【讨论】:

    【解决方案3】:

    您的代码没有问题。该消息意味着hh.ru 已永久移至另一个域。

    【讨论】:

    • 当域从http 移动到https 时,这个简单的答案帮助了我
    【解决方案4】:

    我测试了你的代码,没问题,但是当我使用“hh.ru”时,和你的问题一样,当我使用lynx(命令行浏览器)连接到“hh.ru”时,它会显示我知道它正在重定向到另一个 url,然后告诉我它已被永久移动,然后出现此警报:
    “警告!:此客户端不包含对 HTTPS URL 的支持”

    【讨论】:

      【解决方案5】:

      检查提供的 URL 是 HTTP 还是 HTTPS,考虑添加协议是否您仅使用 http(s)://domainname.com/resource-name 等域名

      阅读:https://en.wikipedia.org/wiki/HTTP_301

      【讨论】:

        【解决方案6】:

        当我将特定文件放在服务器上运行时,我解决了我的问题。 而不是http://hh.ru, 我用http://hh.ru/index.php。 它对我有用

        【讨论】: