Proxy server code php

codedokode / proxy.php

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

/**
* Простой прокси-сервер на PHP для изучения и модификации данных,
* передаваемых между браузером и сторонним сервером.
*
* Запуск:
*
* указать URL сайта в $base
* php -S 127.0.0.1:9001 proxy.php
*
* После этого в браузере можно открывать http://127.0.0.1:9001/
* и все запросы пойдут через прокси на указанный в $base адрес.
*/
// Для вывода данных в консоль
$ stderr = fopen( ‘php://stderr’ , ‘w’ );
$ url = $ _SERVER [ ‘REQUEST_URI’ ];
$ path = parse_url( $ url , PHP_URL_PATH );
$ query = parse_url( $ url , PHP_URL_QUERY );
$ newPath = ltrim( $ path , ‘/’ );
if ( $ query )
$ newPath .= ‘?’ . $ query ;
>
$ base = ‘https://someapprentice.github.io/maintaskforlayout/’ ;
$ proxyUrl = $ base . $ newPath ;
// $context = stream_context_create();
$ contents = @file_get_contents( $ proxyUrl /* , false, $context */ );
// Получаем заголовки ответа из глобальной переменной (PHP!)
$ headers = $ http_response_header ;
$ firstLine = $ headers [ 0 ];
if ( $ contents === false )
fwrite( $ stderr , » Request failed: $ proxyUrl — $ firstLine \n»);
header(» HTTP/1.1 503 Proxy error «);
die(» Proxy failed to get contents at $ proxyUrl «);
>
fwrite( $ stderr , » $ proxyUrl — OK: $ firstLine \n»);
$ allowedHeaders = » !^(http/1.1|server:|content-type:|last-modified|access-control-allow-origin|Content-Length:|Accept-Ranges:|Date:|Via:|Connection:|X-|age|cache-control|vary)!i «;
// Прокидываем разрешенные заголовки
foreach ( $ headers as $ header )
if (preg_match( $ allowedHeaders , $ header ))
fwrite( $ stderr , » + $ header \n»);
header( $ header );
> else
fwrite( $ stderr , » — $ header \n»);
>
>
echo $ contents ;

Источник

Создание простого API-прокси-сервера с PHP

Сейчас я играю с Backbone и использую публичный API в качестве источника. Веб-браузер имеет одну ужасную особенность: он не позволяет вам извлекать какие-либо внешние ресурсы на наш хост из-за ограничений на разные источники. Например, если у нас есть сервер на локальном хосте, мы не можем выполнить один AJAX-запрос к другому хосту, отличному от локального хоста. В настоящее время есть заголовок, позволяющий это сделать:
Access-Control-Allow-Origin , Проблема в том, что удаленный сервер должен настроить этот заголовок. Например, я играл с API GitHub, и у GitHub нет этого заголовка. Если сервер является моим сервером, довольно просто поместить этот заголовок, но, очевидно, я не являюсь системным администратором github, поэтому я не могу этого сделать. Какое решение? Одним из возможных решений является, например, создание прокси-сервера на локальном хосте с PHP. С PHP мы можем использовать любой удаленный API с curl (я писал об этом
здесь и
здесь например). Это не сложно, но я спросил себя: можем ли мы создать фиктивный прокси-сервер с PHP для обработки любого запроса на локальный хост и перенаправления на реальный сервер, вместо того, чтобы создавать один прокси для каждого запроса? Давайте начнем. Вероятно, есть одно решение с открытым исходным кодом (скажите, знаете ли вы его), но я нахожусь в отпуске, и я хочу немного кодировать (я сейчас, это выглядит безумно, но это я
).

Идея заключается в следующем:

. $proxy->register('github', 'https://api.github.com'); .

HTTP: // локальный / GitHub / пользователей / gonzalo123

Метод запроса также важен. Если мы создаем POST-запрос к localhost, мы хотим, чтобы POST-запрос также выполнялся на github.

На этот раз мы не собираемся изобретать велосипед, поэтому мы будем использовать symfony componets, поэтому мы будем использовать composer для запуска нашего проекта:

Мы создаем файл conposer.json с зависимостями:

И мы можем начать кодирование. Сценарий будет выглядеть так:

register('github', 'https://api.github.com'); $proxy->run(); foreach($proxy->getHeaders() as $header) < header($header); >echo $proxy->getContent();

Как мы видим, мы можем зарегистрировать столько серверов, сколько захотим. В этом примере мы регистрируем только github. Приложение имеет только два класса:
RestProxy , который извлекает информацию из объекта запроса и обращается к реальному серверу через CurlWrapper .

request = $request; $this->curl = $curl; > public function register($name, $url) < $this->map[$name] = $url; > public function run() < foreach ($this->map as $name => $mapUrl) < return $this->dispatch($name, $mapUrl); > > private function dispatch($name, $mapUrl) < $url = $this->request->getPathInfo(); if (strpos($url, $name) == 1) < $url = $mapUrl . str_replace("/", NULL, $url); $queryString = $this->request->getQueryString(); switch ($this->request->getMethod()) < case 'GET': $this->content = $this->curl->doGet($url, $queryString); break; case 'POST': $this->content = $this->curl->doPost($url, $queryString); break; case 'DELETE': $this->content = $this->curl->doDelete($url, $queryString); break; case 'PUT': $this->content = $this->curl->doPut($url, $queryString); break; > $this->headers = $this->curl->getHeaders(); > > public function getHeaders() < return $this->headers; > public function getContent() < return $this->content; > >

RestProxy получает два экземпляра в конструкторе через внедрение зависимостей (CurlWrapper и Request). Эта архитектура очень помогает в тестах , потому что мы можем высмеивать оба экземпляра. Очень полезно при сборке RestProxy.

RestProxy зарегистрирован в packaist, поэтому мы можем установить его с помощью установщика composer:

Сначала установите компонент

curl -s https://getcomposer.org/installer | PHP

php composer.phar create-project gonzalo123 / rest-proxy proxy

Если мы используем PHP5.4 (если нет, чего вы ждете?), Мы можем запустить встроенный сервер

cd proxy php -S localhost:8888 -t www/

Теперь нам нужно только открыть веб-браузер и набрать:

http://localhost:8888/github/users/gonzalo123

Библиотека очень минимальна (этого достаточно для моего эксперимента) и не допускает авторизацию.

Конечно, полный код доступен в github .

Источник

How do I write a simple PHP transparent proxy?

I need to make a proxy script that can access a page hidden behind a login screen. I do not need the proxy to «simulate» logging in, instead the login page HTML should be displayed to the user normally, and all the cookies and HTTP GET/POST data to flow through the proxy to the server, so the login should be authentic. I don’t want the login/password, I only need access to the HTML source code of the pages generated after logging in. Does anybody here know how this can be accomplished? Is it easy? If not, where do I begin?* (I’m currently using PHP)*

4 Answers 4

Have your PHP script request the URL you want, and rewrite all links and form actions to point back to your php script. When receiving requests to the script that have a URL parameter, forward that to the remote server and repeat.

You won’t be able to catch all JavaScript requests, (unless you implemented a JavaScript portion of your «proxy»)

Eg: User types http://example.com/login.php into your proxy form.

make sure to urlencode the parameter «http://example.com/login.php»

$url = $_REQUEST['url']; // make sure we have a valid URL and not file path if (!preg_match("`https?\://`i", $url)) < die('Not a URL'); >// make the HTTP request to the requested URL $content = file_get_contents($url); // parse all links and forms actions and redirect back to this script $content = preg_replace("/some-smart-regex-here/i", "$1 or $2 smart replaces", $content); echo $content; 

Note that /some-smart-regex-here/i is actually a regex expression you should write to parse links, and such.

The example just proxies the HTTP Body, you may want to proxy the HTTP Headers. You can use fsockopen() or PHP stream functions in PHP5+ (stream_socket_client() etc.)

Источник

Читайте также:  Программа суммы трех чисел питон
Оцените статью