【问题标题】:PHP: How to detect a website redirect that returns a '404' status code?PHP:如何检测返回“404”状态码的网站重定向?
【发布时间】:2015-03-12 14:12:27
【问题描述】:

我正在编写一个小的 php 脚本,它可以区分来自第三方网站的不同类型的响应。

对于人类访问者来说,识别差异相当容易:响应 #1 是一个简单的 404 错误页面,而响应 #2 重定向到主页。

对于我的脚本,这变得有些困难。两种类型都返回“404”状态代码,file_get_contents() 对两者都返回空,并且“重定向”并没有真正注册为重定向(就像我说的,有一个“404”状态代码,而不是“30X”)。 Get_headers() 也没有显示任何区别(没有“位置:”或任何类似的东西)。

我有什么办法可以做到这一点?

【问题讨论】:

  • get_headers($the_URL, 0);
  • 您是否使用 cURL 来检索此外部网页?
  • 张贴网址看看他们的反应。
  • 如上所述,get_headers() 没有区别,我正在使用 file_get_contents() 来检索页面。我应该改用 cURL 吗?
  • @axiac:一会儿给你发消息。

标签: php redirect


【解决方案1】:

有很多方法可以进行重定向:

  • 用于重定向的 HTTP 响应代码(通常是 301302)以及包含 URL 的 Location: 标头

    HTTP/1.1 302 Found
    Location: http://www.example.org
    
  • HTTP 标头 Refresh:;它包含等待的秒数和新的 URL:

    Refresh: 0; url=http://www.example.org
    
  • 模拟刷新 HTTP 标头的 HTML meta 元素:

    <meta http-equiv="Refresh" content="0; url=http://www.example.org">
    
  • Javascript:

    <script>document.location = 'http://www.example.org';</script>
    

    请注意,使用 Javascript 进行重定向有无数种可能性。它们的共同点是使用documentwindowlocation 属性。 locationLocation 类型的对象,可以使用字符串直接分配,也可以使用其href 属性或其方法assign()replace() 进行更改。

如果对您的 URL 的请求未返回任何内容,则返回状态代码 404 且没有 Location: 标头,然后检查响应中是否存在 Refresh: 标头。

您最好使用curl 而不是file_get_contents() 来发出请求。 curl 可以更好地控制发送和接收的标头。

【讨论】:

  • 非常感谢 - 成功了。我使用了这里的一些代码:stackoverflow.com/questions/14953867/… - 然后我通过 htmlspecialchars() 发送了结果,现在我有了可以使用的整个输出。原来重定向是通过 Javascript (window.location) 完成的。
【解决方案2】:

我建议您向所需站点发出cURL 请求,看看它是什么类型的响应。

PHP manual中所述,

curl_getinfo ($handle, CURLINFO_HTTP_CODE);

会给你一个关联数组,在其中你会找到http_code 键,它将保存你的状态码。

如果重定向案例会给您非 30X 状态码,您可以尝试通过以下方式获取重定向 url:

curl_getinfo ($handle, CURLINFO_REDIRECT_URL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多