定制 akrez/http-proxy 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

akrez/http-proxy

Composer 安装命令:

composer require akrez/http-proxy

包简介

Akrez http proxy

README 文档

README

راه‌اندازی فیلترشکن با هاست اشتراکی PHP

چرا از هاست اشتراکی PHP استفاده کنیم؟

  • قیمت مناسب:
    هاست‌های اشتراکی معمولاً هزینه‌ی بسیار کمتری نسبت به سرورهای اختصاصی دارند و این موضوع برای بسیاری از کاربران جذاب است.
  • IP‌های تمیز:
    هاست‌ها معمولاً از IP‌های تمیز و معتبر استفاده می‌کنند که می‌تواند در عملکرد بهتر فیلترشکن مؤثر باشد.
  • پهنای باند نامحدود:
    بسیاری از سرویس‌دهندگان هاستینگ پهنای باند نامحدود ارائه می‌دهند که این ویژگی برای فیلترشکن بسیار مناسب است، زیرا بدون نگرانی از محدودیت پهنای باند می‌توانید از اینترنت استفاده کنید.
  • راه‌اندازی راحت‌تر:
    مدیریت هاست اشتراکی و راه‌اندازی یک اسکریپت ساده PHP بسیار آسان‌تر از مدیریت سرور اختصاصی یا مجازی است.

چه مشکلاتی وجود دارد؟

  • محدودیت پروتکل‌ها:
    هاست‌های اشتراکی ممکن است فقط از پروتکل‌های محدودی پشتیبانی کنند که این موضوع می‌تواند عملکرد فیلترشکن را تحت تأثیر قرار دهد.
  • مناسب نبودن برای موبایل:
    این روش هنوز برای گوشی‌های همراه بهینه‌سازی نشده است و نیاز به توسعه بیشتری دارد.
  • پیچیدگی برای کاربران عادی:
    استفاده از این نوع فیلترشکن ممکن است برای کاربران عادی کمی گیج‌کننده باشد و نیاز به راهنمایی بیشتری داشته باشد.

چطور کار می‌کند؟

به طور کلی این روش مشابه عملکرد یک HTTP Proxy است، اما به دلیل محدودیت‌ها، تفاوت‌هایی در نحوه اجرا وجود دارد:

  1. درخواست اصلی دستکاری می‌شود تا بتوان آن را به هاست پراکسی ارسال کرد.
  2. پس از رسیدن درخواست دستکاری‌شده به هاست پراکسی، درخواست اصلی بازیابی شده، پردازش می‌شود و پاسخ به کاربر بازگردانده می‌شود.
==OriginalRequest==> (local http proxy server: manipulate request to change method and url) ==ManipulatedRequest==> (proxy shared host: recover original request using script and resolve it and return response) ==Response==>

بیایید با یک مثال بررسی کنیم

فرض کنید می‌خواهیم درخواست زیر را به آدرس www.blocked.com/sensored/content.json ارسال کنیم:

OPTIONS /sensored/content.json HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.blocked.com
Content-Type: application/json

{ "name": "John Doe", "email": "john.doe@example.com" }

محدودیت‌ها

  • محدودیت در متد:
    شاید متد اصلی (مانند OPTIONS) روی هاست پشتیبانی نشود؛ پس باید قبل از ارسال، متد را به POST تغییر دهیم و در هاست، دوباره آن را بازیابی کنیم.
  • هدر Host:
    هدر Host درخواست اصلی با میزبان پراکسی متفاوت است و باید جایگزین شود.

پس چه راه‌حلی داریم؟

آدرس درخواست را طوری تغییر می‌دهیم که به هاست پراکسی برسد. مثلاً:

https://www.blocked.com/sensored/content.json

تبدیل می‌شود به:

https://www.proxy-host.com/inline.php/https_OPTIONS/www.blocked.com/sensored/content.json

پس در این حالت، درخواست زیر به جای درخواست اصلی (در این مثال یعنی درخواست بالا) ارسال می‌شود:

POST /inline.php/https_OPTIONS/www.blocked.com/sensored/content.json HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Content-Type: application/json
Host: www.proxy-host.com

{ "name": "John Doe", "email": "john.doe@example.com" }

توضیح بخش‌های URL

بخش توضیح
https://www.proxy-host.com/inline.php مسیر اسکریپت روی هاست اشتراکی. می‌تواند به عنوان توکن برای هر کاربر نیز عمل کند. یعنی اسکریپت میتواند روی فایل unpredictable_personal_token.php به جای inline.php هاست شود
https_OPTIONS بخش کانفیگ: پروتکل و متد. با _ جدا می‌شوند و اختیاری‌اند. می‌توانید debug هم اضافه کنید (https_OPTIONS_debug).
www.blocked.com/sensored/content.json آدرس اصلی درخواست همراه با تمام پارامترها.

چرا فکر میکنی این راه بهتره؟

وقتی تغییرات را فقط توی آدرس اضافه کنیم با کمترین تغییرات میتونیم فیلتر یا تحریم را دور بزنیم. مثلا یک کتابخونه را در نظر بگیرید که با آدرس https://api.telegram.org در تعامل هست و این آدرس را در متغیر $baseUrl ذخیره کرده. حالا فقط کافیه به نحوی $baseUrl را به https://www.proxy-host.com/inline.php/https/api.telegram.org تغییر بدید. بدون اینکه نیازی باشه هدرها را دستکاری کنید. همین!

آیا باید دستی URL‌ها را تغییر دهیم؟

خیر. برای این کار از MitmProxy استفاده می‌کنیم تا درخواست‌ها به صورت خودکار دستکاری شوند. فایل‌های مورد نیاز در مسیر client/addons.py قرار دارند.

مراحل نصب و راه‌اندازی

ریپوزیتوری را کلون کنید تا فایل‌ها را در اختیار داشته باشید.

یکی از نسخه‌های پرتابل MitmProxy را از https://www.mitmproxy.org/downloads دانلود کرده و فایل mitmdump.exe را به پوشه client منتقل کنید.

یک بار فایل mitmdump.exe را اجرا کنید تا فایل‌های گواهی امنیتی لازم ایجاد شوند.

برای نصب گواهی، دستور زیر را در Command Prompt (خط فرمان ویندوز) اجرا کنید:

certutil -addstore root "%USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer"

برای مرورگر فایرفاکس، بر اساس راهنمای رسمی MitmProxy، مراحل اضافی را انجام دهید.

فایل addons.py را باز کنید و متغیر config را با تنظیمات مورد نیاز پر کنید.

در نهایت، با پارامترهای زیر MitmProxy را اجرا کنید:

mitmdump.exe -s addons.py

در تنظیمات سیستم ویندوز، پراکسی را روی 127.0.0.1 و پورت را برابر local_server_port (اینجا 8080) قرار دهید.

برای هاست باید چه کاری انجام دهیم؟

دستور composer require akrez/http-proxy را اجرا کنید تا پوشه vendor ساخته بشه حالا یک فایل به اسم مثلا inline.php ایجاد کنید و کد زیر را در اون کپی کنید. پوشه vendor و inline.php را روی هاست آپلود کنید.

<?php

require_once './vendor/autoload.php';

use Akrez\HttpProxy\Factories\InlineFactory;
use Akrez\HttpProxy\Senders\CurlSender;

$request = InlineFactory::emitSender(new CurlSender);
  • ممکنه آدرس ./vendor/autoload.php برای شما متفاوت باشه که بستگی به محل آپلودش داره
  • فایل inline.php میتونه هر اسم دیگه‌ای داشته باشه همونطور که در بالا اشاره کردم
  • اگر مقدار $request برابر null بود یعنی اسکریپت به درستی صدا زده نشده یعنی مثلا آدرس https://proxy-php-host.com/inline.php به تنهایی صدا زده شده.

چرا نوشتم؟

  • خستگیمون در بره :
    ما اینجا داریم زحمت میکشیم 😃 این کار حاصل 4 سال تلاش در زمان فراغت و حدود 7000 خط کد هست که با انواع کتابخانه ها مثل walkor/workerman و reactphp/reactphp و ... پیاده سازی شد اما جواب نداد تا بالاخره بهترین راه رو پیدا کردم.
  • بهترش کنیم :
    هنوز راه درستی برای دسترسی موبایل پیدا نکردم. همچنین به نظرم پیاده سازی برای کاربر معمولی سخته و البته کلی باگ دیگه هست.
  • ایده بگیرید و بهترش رو بسازید :
    این راه به ذهن من رسید اما امیدوارم شما بعد از خوندن کدها و ایده کلی از این پروژه راههای بهتری رو درست کنید (مثلا با استفاده از Http Tunnel).
  • و استفاده کنیم :
    مهمترین قسمت اینه، لذت اتصال به اینترنت آزاد با بیشترین استتار 🎉 لطفا به فکر بقیه هم باشید، فقط خودمون مهم نیستیم.

akrez/http-proxy 适用场景与选型建议

akrez/http-proxy 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 19 次下载、GitHub Stars 达 6, 最近一次更新时间为 2024 年 12 月 13 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「http」 「proxy」 「akrez」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 akrez/http-proxy 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 akrez/http-proxy 我们能提供哪些服务?
定制开发 / 二次开发

基于 akrez/http-proxy 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 19
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 6
  • 点击次数: 18
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 6
  • Watchers: 1
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: Unknown
  • 更新时间: 2024-12-13