【问题标题】:Detect if a web page has a javascript redirect检测网页是否有 javascript 重定向
【发布时间】:2012-11-26 19:47:49
【问题描述】:

我正在使用 cURL 访问许多不同的页面。我想要一种优雅的方式来检查页面是否有 javascript 重定向。我可以检查正文中是否存在window.location,但由于它可能位于 .js 文件中或使用 jQuery 之类的库,因此似乎任何解决方案都不完美。有人有什么想法吗?

【问题讨论】:

  • 不可能(很容易)使用简单的 curl 请求,因为 curl 不支持 javascript。
  • 是的,我想更多的是通过解析器运行标记,而不是执行它。
  • 如果您使用解析器(或编写解析器),您可以编译请求文件内容中的 .js 文件列表。使用该列表,您可以下载这些文件并解析它们是否存在重定向。由于您在解析器中下载文件时可以访问源代码,因此您可以将基本 url(从您最初使用的 url 推断)附加到文档中使用的链接以下载它们
  • @popnoodles cURL 不会触发 javascript 重定向,因此将没有要解析的 url
  • 也许你可以使用像 capybara/selenium 这样的东西:christopherbloom.com/2012/03/12/…

标签: php javascript curl


【解决方案1】:

感谢 Ikstar 指出 phantomjs 我制定了以下示例:

test.js

var page = require('webpage').create();
var testUrls = [
    "http://www.google.nl",
    "http://www.example.com"
];

function testNextUrl()
{
    var testUrl = testUrls.shift();
    page.open(testUrl, function() {
        var hasRedirect = page.url.indexOf(testUrl) !== 0;
        console.log(testUrl + ": " + hasRedirect.toString());
        if (testUrls.length) {
            testNextUrl();
        } else {
            phantom.exit();
        }
    });
}

testNextUrl();

结果:

D:\Tools\phantomjs-1.7.0-windows>phantomjs test.js
http://www.google.nl: false
http://www.example.com: true

【讨论】:

  • 你的代码是如何通过 JS 客户端重定向实现的? page.open 不会在任何 JS 重定向运行之前完成吗?
【解决方案2】:

您不能仅通过解析脚本来做到这一点。只有执行才会显示页面JS的真实流程。

模拟执行的一种方法是使用具有重定向的不同级别的代码级别。最上面的将在<script> 标签下,这里的任何重定向都是直接重定向。如果在函数中发现任何重定向,那么您必须跟踪程序的结构并进行猜测。

【讨论】:

  • 这取决于@madphp 所说的“有一个 javascript 重定向”是什么意思......如果他只想检测重定向的存在,一个简单的解析器,就像我在问题会很好用。如果他想知道一个是否存在并且会被执行,他需要做出这些猜测。
  • 是的,这是个问题。我想知道函数中的 window.location 是否有无害的原因。就像重定向到移动版本或非 Flash 页面一样。
  • @renab。是的,这就是为什么我给出了两种意见
【解决方案3】:

取决于使用 Curl 的目的以及页面上实际需要重定向。可以合并像 PhantomJS (http://phantomjs.org/) 这样的无头框架来进行必要的浏览。您将能够查看是否会发生重定向以及跟踪页面上执行的任何其他 javascript。

【讨论】:

    【解决方案4】:

    仅分析网页源代码不可能检测重定向的存在。

    不可判定的Halting problem 可以用JavaScript 编码。该算法可能会停止,从而导致生成重定向,或者永远运行。由于我们不知道代码是否会停止,因此也不可能决定是否执行重定向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 2011-11-30
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2013-02-13
      相关资源
      最近更新 更多