В ка­че­стве пре­ды­сто­рии: я в по­те ли­ца и про­чих не ме­нее неу­дач­ных ча­стей сво­е­го брен­но­го те­ла ра­бо­таю на сла­ву, про­цве­та­ние и до­брое имя компа­нии, ко­то­рая за­ни­ма­ет­ся раз­ра­боткой "убий­цы http://hidemyass.com/" и до­бро­го де­сят­ка подоб­ных ему сер­ви­сов. О раз­вер­ты­ва­нии и струк­ту­ре се­ти vpn сер­ве­ров на ба­зе openvpn, борь­бе с torrent тра­фи­ком, тонна­ми спам­ма, де­ше­вы­ми vds-ка­ми, ин­дус­ским ан­гло­го­во­ря­щем на ки­тайском са­ппор­том и про­чи­ми пре­ле­стя­ми я напи­шу чуть поз­же, сего­дня мы по­го­во­рим с ва­ми об ано­ни­майзе­ре. Вас ист дас, Фаль­де­мар? Дас ист та­кой се­бе бы­стрый брау­зер­ный "прок­си", что-то ти­па http://www.hidemyass.com/proxy/, вы вво­ди­те ссыл­ку, скрипт ска­чи­ва­ет ее и отда­ет вам, ми­нуя огра­ни­че­ния кор­по­ра­тив­ных firewall-ов напри­мер или скры­вая ваш user-agent (ко­му в хуй вва­лил­ся ваш юзе­ра­гент, про­сти­те? ох уж эта paranoia™). В Пе­де­ви­кии есть много тек­ста по дан­ной те­ме. Как по мне, меж­ду на­ми де­воч­ка­ми, - аб­со­лют­но не­нуж­ная за­тея, учи­ты­вая все слож­но­сти ее функ­ци­о­ни­ро­ва­ния. Но, имей мое мне­ние хоть ка­кой-ли­бо удель­ный вес, мы бы сей­час за­ни­ма­лись произ­водством рус­ско­го сту­ден­че­ско­го ка­че­ствен­но­го пор­но, а не раз­ра­боткой сер­ви­сов ано­ним­но­сти и без­опас­но­сти в се­ти. Что до­ста­точ­но груст­но, спрос на пор­ну­ху все же много больше, яще­таю. Игно­ри­ро­ва­ние по­треб­но­стей рын­ка ве­дет нас в глу­хой угол.

Хи­хань­ки-ха­хонь­ки, но из­на­чаль­но бы­ли осмот­ре­ны 2 бес­плат­ных ре­ше­ния. PHPproxy и Glype. Вот толь­ко как-то не уда­лось мне по­лу­чить до­зу эсте­ти­че­ско­го удо­воль­ствия от вну­трен­но­стей и что самое глав­ное - бы­стро­дей­ствия, ну па­ца­ны, 30 ре­гу­ля­рок на 1 стра­ни­цу - как-то слиш­ком, ага. Да и сов­ме­сти­мость с совре­мен­ны­ми сайта­ми, расфу­фе­рен­ны­ми AJAX-ами, остав­ля­ла же­лать луч­ше­го. При­шлось пи­сать соб­ствен­ный ве­ло­си­пед. Сра­зу про­шу про­стить за PHP, увы и ах, но та­ковы тре­бо­ва­ния за­каз­чи­ков для "глу­бо­кой ин­те­гра­ции" это­го гов­на в глотку сайта. Пре­жде всего, я отка­зал­ся от пере­да­чи URL прок­си­ми­зи­ру­е­мо­го сайта в GET пере­мен­ной, из­брав бо­лее ин­терес­ный путь. Для на­гляд­но­го при­ме­ра, дан­ный блог, откры­тый по­сред­ством мо­е­го web-прок­си, вы­гля­дит как https://mindcollapse.com.proxy.domain.com/blabla.html. Плю­сы та­ко­го эле­гант­но­го ре­ше­ния: удоб­ная ра­бо­та с ку­ки­са­ми, ко­то­рые про­сто мож­но на­зна­чать дан­но­му саб­до­ме­ну, а не хра­нить во вре­мен­ных файлах, как это де­ла­ли вы­ше­на­зван­ные ре­а­ли­за­ции, лег­кость под­ме­ны ссы­лок в стра­ни­це, в том чис­ле и relative links, ко­то­рые во­об­ще тро­гать не нуж­но.  То бишь, мы про­сто до­бав­ляем .proxy.domain.com по­сле до­мен­но­го име­ни и направ­ляем весь тра­фик че­рез наш сер­вер. Те­перь по по­во­ду тех­но­ло­гий ре­а­ли­за­ции. Для на­ча­ла, нам не по­ме­ша­ет wildcard SSL сер­ти­фи­кат с мас­кой *.domain.com. Ну и ни­как не обой­дем­ся без *.proxy A Record на нейм­сер­ве­рах на­ше­го с ва­ми до­ме­на. В апа­чев­ский кон­фиг sites-enabled/proxy.domain.com.conf до­бав­ляем ServerAlias *.proxy.domain.com. Пол ра­бо­ты сде­ла­но, те­перь де­ло за ма­лым - на­пи­сать об­ра­бот­чик дан­ных. Пре­жде всего, нам ну­жен пра­виль­ный .htaccess с RewriteRule ^(.*)$ /proxy.php?$1 [L]. Те­перь лю­бые запро­сы бу­дут реврайтит­ся в REQUEST_URI proxy.php. Не за­бы­ва­ем и про RewriteCond %{REQUEST_FILENAME} !-f, а ина­че по­лу­чи­те веч­ный ре­ди­рект в по­ис­ках сча­стья. 

Ли­ри­че­ское от­ступ­ле­ние по по­во­ду со­дер­жа­ния proxy.php. Я как-то уже дав­нень­ко не под­хо­дил к PHP, все в компи­ли­ру­е­мых язы­ках, да в пер­лах по са­мые локти. Кста­ти, на­счет по­след­не­го, кто там го­во­рит, что перл мертв - по­смот­ри­те на ко­ли­че­ство жи­вых ве­ло­си­пе­дов в CPAN. Од­них толь­ко ин­тер­фей­сов ке­ши­ро­ва­ния хва­тит да­же чрез­вы­чай­но изо­щрен­но­му уму. Ну а про ско­ро­по­стиж­ную кон­чи­ну кри­чит вся­кая шко­ло­та, чи­та­ю­щая кло­аку вро­де ха­бра­ха­бра и меч­та­ю­щая о за­вет­ном ин­вайте. Да, есть RubyForge и RubyGems, есть Pypi для монти пайто­на, да­же C# в Microsoft Visual Studio име­ет ме­не­джер компо­нен­тов, а со­всем не­дав­но си­ла­ми ком­мью­ни­ти еще и nuget вы­шел, ко­то­рый я все ни­как не по­смот­рю. И да, есть PEAR для PHP. На­бор биб­лио­тек в нем, мяг­ко го­во­ря, скуд­ный. PEAR "из ко­роб­ки" не да­ет ста­вить па­ке­ты у ко­то­рый ре­лиз ста­тус ни­же stable, а как это от­клю­чить - при­хо­дит­ся гуглить или уста­нав­ли­вать по ссыл­ке, как-то не очень со­по­став­ляет­ся дан­ные дей­ствия с опре­де­ле­ни­ем "удоб­но­го ме­не­дже­ра компо­нен­тов". Ну да не важ­но, для на­ше­го прок­си мы бу­дем ис­поль­зо­вать об­вяз­ку не во­круг CURL-а, а над fsockopen. На­зы­ва­ет­ся HTTP_Request2. Би­блио­тека, меж­ду про­чим, очень да­же ни­че­го. По­жа­луй, хва­тит хо­дить во­круг да око­ло: вот вам код proxy.php в ко­пи­па­стере. Хо­чу за­ме­тить, что это ско­рее бол­ванка из ко­то­рой я уб­рал большу часть ко­да ис­поль­зу­е­мую при раз­бо­ре джа­вас­крип­тов и css, да и до­брый 10к пла­ги­нов, ко­то­рые за­став­ля­ли ра­бо­тать юту­бы и фейс­бу­ки. Ни­че­го там слож­но­го нет, про­сто firebug или chrome developer tools вам в ру­ки и ко­пайтесь в ку­че не­по­нят­ных ку­ки­сов и сжа­тых js-скрип­тов. Для по­след­них, кста­ти, есть от­лич­ная ути­ли­та - JSBeautifier. Так что не нуж­но кри­чать "ха­аа, лох, у те­бя же ни­как не про­ве­ря­ет­ся вво­ди­мый урл, ха­а­аа". Про­ве­ря­ет­ся. Хри­стом бо­гом кля­нусь. У ме­ня все.