首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个用PHP编写的真正的代理,或者,为了实现一个代理,我需要做些什么?

是否有一个用PHP编写的真正的代理,或者,为了实现一个代理,我需要做些什么?
EN

Stack Overflow用户
提问于 2012-09-16 18:35:53
回答 1查看 1.8K关注 0票数 3

我一直在网上寻找一个PHP代理脚本,我找不到任何。我一直在寻找的脚本,下载页面和编辑srchref属性的HTML,并要求我浏览到任何网站的安装。我不需要这个,我需要一个真正的代理监听端口,我可以设置我的浏览器路由所有它的请求。

我想做的是:

  1. 运行一个PHP脚本,它将在我自己的计算机的某个端口上侦听
  2. 将我的web浏览器配置为使用localhost:port作为代理
  3. 让PHP脚本将页面提供给我的浏览器

我发现,所有用PHP编写的所谓代理脚本,如果请求的页面使用XMLHttpRequest来获取内容,都会失败,因为它们根本看不到这个请求。任何链接重写都不能解决这个问题,除非注入一些聪明的JavaScript,这对于一个真正的代理来说是不必要的。

最后,我想要的是能够访问在浏览器和远程服务器之间来回的请求和响应。我希望能够使用浏览器对JavaScript、cookies、flash等的支持。基本上,我希望能够编程访问所有的通信,这样我就可以使用PHP来分析或操作它。

所以,问题是

  • 我是否因为搜索结果中的所有干扰而错过了用PHP实现的真正代理?
  • 如果PHP中没有真正的代理,我想尝试制作一个代理。是否有在线资源来帮助我了解我到底该做什么?(请注意,I RTM虔诚地:寻找更多的基本代理的警告和架构)

链接将不胜感激。我知道有几个MITM代理,但是我想在PHP中找到一个。

我不知道我是否可以用PHP内置的PHP服务器做点什么,但我也会搞砸的。

更新

我已经为内置在got服务器中的PHP提供了一个路由器脚本,它开始显示出希望。我可以启动web服务器并告诉我的web浏览器使用它作为代理。我所做的路由器脚本区分了本地资源和外部资源,并给出了一种处理这两种情况的简单方法。我唯一的问题是如何使用https。服务器报告Invalid Request (Malformed HTTP Request)。我认为这意味着这个服务器根本不会只使用脚本和设置就完成https。我不知道。也许我可以用Apache来完成它,但是透明地代理https听起来很难,特别是如果我想在数据到达浏览器之前修改它。

AtropaToolbox/php_router/router.php是我在webserver中构建的路由器脚本,它从其他文件中提取实际的类。

代码语言:javascript
复制
<?php
require_once('AtropaToolbox/php_proxy/proxy.php');

$proxy = new atropa_proxy();

if($proxy->process_request() === false) {
    return false;
}

?>

AtropaToolbox/php_proxy/proxy.php扩展了atropa_mod_proxy以重新定义处理程序。

代码语言:javascript
复制
<?php
require_once('AtropaToolbox/php_proxy/mod_proxy.php');

class atropa_proxy extends atropa_mod_proxy 
{
    protected function local_resource_handler() {
        return false;
    }

    protected function external_resource_handler() {
        $ext = $this->get_page();
        //echo '<pre>' . print_r($ext, true) . '</pre>';
        //$ext['page'] = preg_replace('/<a /', '<p ', $ext['page']);
        $this->show_page($ext);
    }
}
?>

AtropaToolbox/php_proxy/mod_proxy.php通用路由器脚本

代码语言:javascript
复制
<?php
/**
 * Rev. 1 Atropa mod_proxy for php built in webserver
 */
class atropa_mod_proxy
{
    protected function is_external_resource() {
        $host = parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST);
        if(isset($host) && $host !== $_SERVER['SERVER_NAME']) {
            return true;
        } else {
            return false;
        }
    }

    protected function local_resource_handler() {
        return false;
    }

    protected function external_resource_handler() {
        $ext = $this->get_page();
        $this->show_page($ext);
    }

    public function process_request() {
        if($this->is_external_resource()) {
            return $this->external_resource_handler();
        } else {
            return $this->local_resource_handler();
        }
    }

    public function get_request_headers() {
        $arr = array();
        foreach($_SERVER as $svar => $sval) {
            if(substr($svar, 0, 4) === 'HTTP') {
                $svar = substr($svar, 5);
                $svar = preg_replace('/_/', ' ', $svar);
                $svar = ucwords(strtolower($svar));
                $svar = preg_replace('/ /', '-', $svar);
                $arr[$svar] = $sval;
            }
        }
        return $arr;
    }

    public function pack_request_headers($headers_array) {
        $packed = '';
        foreach($headers_array as $header_name => $header_value) {
            $packed .= $header_name . ': ' . $header_value . "\r\n";
        }
        return $packed;
    }

    public function echo_response_headers($http_response_header_array) {
        foreach($http_response_header_array as $val) {
            if(strpos(strtolower($val), 'connection') !== 0) {
                header($val);
            }
        }
    }

    protected function get_page() {
        $request_headers = $this->get_request_headers();
        $request_headers = $this->pack_request_headers($request_headers);
        $method = $_SERVER["REQUEST_METHOD"];
        $scheme = parse_url($_SERVER['REQUEST_URI'], PHP_URL_SCHEME);
        $opts = array(
            $scheme => array(
                'method' => $method,
                'header' => $request_headers
            )
        );
        if(count($_POST) > 0) {
            $content = http_build_query($_POST);
            $opts[$scheme]['content'] = $content;
        }
        $context = stream_context_create($opts);
        $ext = array();
        $ext['page'] = file_get_contents($_SERVER['REQUEST_URI'], false, $context);
        $ext['http_response_header'] = $http_response_header;
        return $ext;
    }

    protected function show_page($ext) {
        header_remove();
        $this->echo_response_headers($ext['http_response_header']);
        echo $ext['page'];
    }
}
?>
EN

回答 1

Stack Overflow用户

发布于 2012-09-16 18:52:42

请在用PHP进行套接字编程PHP套接字介绍上阅读。您将运行一个PHP守护进程,以使PHP侦听端口并处理所有请求。

为了做到这一点,您可能需要查看http://sourceforge.net/projects/poxy/,以便您可以将PHP建立在那里。您还必须了解代理如何与客户沟通。Poxy是一个基于web的应用程序,您输入一个URL,它会为您加载它.它不允许您侦听端口,它也不是php守护进程,因此您必须为PHP守护进程代理编写大量代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12449569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档