0

你能告诉我这个代码的 node.js 等价物是什么吗:

<?php
    $url = $_GET['url'];
    $html = file_get_contents($url);
    echo $html;
?>

我希望能够做到这一点的原因是因为我想在 iframe 中打开一个外部域页面,并且能够在 iframe 中操作 DOM 而不会遇到相同的域策略

谢谢!

4

2 回答 2

2

@BrandomWamoldt 是正确的,您根本无法访问其他域的 DOM。

作为一种解决方法,您可以让自己的服务器下载该页面并操作 DOM。这样,您就可以从您域中的 URL 提供页面。

这并不是说这是一个好主意,因为您允许其他站点注入您传递给用户的脚本。但这是一个使用jsdom更改另一个站点的页面并从您自己的域发送响应的示例:

var jsdom = require('jsdom');
function handler(req, res){
  jsdom.env(
    "http://stackoverflow.com/questions/19254525/php-echo-equivalent-in-node",
    ["http://code.jquery.com/jquery.js"],
    function (errors, window) {
      window.$('body').prepend(
        window.$('<h1></h1>').text('Text inserted by Node')
      );
      var doc = window.document;
      var output = doc.doctype.toString()+doc.innerHTML;
      res.setHeader('Content-Type', 'text/html');
      res.writeHead(200);
      res.end(output);
    }
  );
};
require('http').createServer(handler).listen(3000);

如果您不关心服务器端的 DOM,您可以简单地下载整个远程页面http.requestrequest库,然后将页面内容作为来自您的域的响应发送。

从安全的角度来看,这同样很糟糕,因此您可能应该寻找替代解决方案

于 2013-10-08T18:07:40.387 回答
0

部分等效是

function h(req, res){
  var query = require('url').parse(req.url,true).query;
  var data = require('url').parse(query.url);
  require('http').request({
    host: url.host,
    path: url.pathname
 }, function(response){
   response.on('data', function (chunk) {res.write(chunk);});
   response.on('end', function () { res.end(); });
 })
}
require('http').createServer(h).listen(80);

res.write 这里将数据发送到浏览器,确保您可以将所有数据存储在某个变量中并将其放入您自己的模板中

更新:使用 get 参数添加url

于 2013-10-08T18:28:31.997 回答