متد output_add_rewrite_var() در PHP
در PHP، تابع output_add_rewrite_var() ابزاری ساده ولی کاربردی برای افزودن یک پارامتر و مقدار مشخص به تمام URLهای خروجی است که توسط بازنویسی URLهای خروجی (URL rewriter) پردازش میشوند. این قابلیت میتواند در مواردی مثل انتقال شناسه جلسه (session id) یا افزودن پارامترهای ردیابی به لینکها بدون تغییر دستی کد HTML مفید باشد. در ادامه به جزئیات، مثالها، نکات امنیتی و محدودیتهای این تابع میپردازیم.
خلاصه و امتیازات کلیدی
| نام تابع | خلاصه |
|---|---|
| output_add_rewrite_var(string $name, string $value) | ثبت یک نام و مقدار برای افزودن خودکار به URLها در خروجی HTML که توسط مکانیسم بازنویسی PHP پردازش میشوند. |
چه چیزی بازنویسی میشود و چه چیزی نه؟
مکانیسم بازنویسی URL در PHP تنها صفات (attributes) مشخصی از تگهای HTML را اصلاح میکند؛ صفاتی مانند href برای a یا action برای form و مواردی که در تنظیم php.ini تحت کلید url_rewriter.tags تعریف شدهاند. تابع output_add_rewrite_var تنها نام و مقدار را ثبت میکند و کار بازنویسی واقعی را موتور PHP هنگام تولید خروجی انجام میدهد.
موارد استفاده رایج
- افزودن پارامتر ردیابی (مثلاً utm_source) به همه لینکهای خروجی در ایمیلسازی یا صفحات خاص.
- پشتیبانی از حالتهایی که کاربر کوکیها را غیرفعال کرده و نیاز به انتقال شناسه جلسه از طریق URL وجود دارد (هرچند این روش اکنون کمتر توصیه میشود).
- اضافه کردن پارامترهای زبانی یا سوییچهای حالت برنامه به لینکها بدون دستکاری تکتک تگهای HTML.
نمونه ساده
<?php
// افزودن پارامتر ردیابی به همه لینکهای خروجی
output_add_rewrite_var('utm_source', 'newsletter');
// سپس محتوای HTML را تولید کنید
?>
<a href="page.php">صفحه داخلی</a>
در صورت فعال بودن بازنویسی، PHP لینک بالا را به شکلی مانند page.php?utm_source=newsletter یا اگر پیشتر پارامتر وجود داشته باشد با & الحاق میکند. این کد قبل از ارسال خروجی باید اجرا شود تا پارامتر ثبت شده در زمان پردازش خروجی در نظر گرفته شود.
مثال واقعی — افزودن پارامتر ردیابی همراه با safeguard
<?php
// اطمینان از اینکه مقدار امن است
$source = isset($_GET['source']) ? rawurlencode($_GET['source']) : 'newsletter';
// ثبت پارامتر برای بازنویسی خروجی
output_add_rewrite_var('utm_source', $source);
// تولید HTML
echo '<a href="product.php?id=42">خرید</a>';
?>
در این مثال از rawurlencode برای جلوگیری از وارد شدن کاراکترهای نامناسب به مقدار پارامتر استفاده شده است. PHP هنگام بازنویسی، مقدار ثبتشده را دقیقاً به URL الحاق میکند؛ بنابراین پیشپردازش و ارزیابی مقدار ضروری است.
بازنشانی پارامترها
برای حذف همه پارامترهای ثبتشده میتوانید از تابع output_reset_rewrite_vars() استفاده کنید. این تابع لیست پارامترهای ثبتشده را پاک میکند و از بازنویسی بعدی جلوگیری میشود.
ملاحظات امنیتی و کاربردی
- نمایش اطلاعات حساس در URL: از افزودن اطلاعات حساس (مانند توکنهای دسترسی یا رمزعبور) به عنوان پارامترِ URL به شدت خودداری کنید؛ URLها ممکن است در لاگها، History مرورگر یا سرویسهای جانبی ذخیره شوند.
- مؤثر در کش و بوکمارک: اضافه شدن پارامترها باعث تفاوت URLها میشود—این میتواند سبب کش شدن نسخههای مختلف و ذخیره شدن لینکهای متفاوت توسط کاربر شود.
- وابستگی به تنظیمات php.ini: لیستی از تگها/صفات که بازنویسی میشوند توسط url_rewriter.tags تعیین میشود؛ در محیطهایی که این تنظیم غیرفعال یا تغییر کرده است، تابع ممکن است رفتار متفاوتی داشته باشد.
- توصیه مدرن: در بیشتر سناریوهای امروزی از کوکیها، هدرها و روشهای امنتر برای ارسال اطلاعات بین درخواستها استفاده میشود. استفاده از output_add_rewrite_var برای session propagation معمولاً توصیه نمیشود مگر در شرایط خاص.
نکات فنی و محدودیتها
- بازنویسی فقط بر روی محتوای HTML و صفات تعریفشده در url_rewriter.tags اعمال میشود.
- اگر URL قبلاً شامل پارامتر با همان نام باشد، PHP معمولاً پارامتر ثبتشده را به انتهای URL اضافه میکند که میتواند منجر به تکرار پارامتر شود؛ بنابراین قبل از ثبت نام پارامتر بررسی کنید یا نامهای یکتا انتخاب کنید.
- این تابع بخشی از هسته PHP است اما رفتار دقیق آن ممکن است در نسخههای مختلف PHP یا پیکربندیهای مختلف وبسرور تفاوتهای جزئی داشته باشد.
جمعبندی و توصیهها
output_add_rewrite_var() ابزار مفیدی برای اتوماتیکسازی افزودن پارامترها به لینکهای خروجی است، مخصوصاً در سناریوهای ردیابی یا زمانی که کنترل روی HTML خروجی محدود است. با این حال، پیش از استفاده توجه کنید که:
- حساسیت اطلاعات را ارزیابی کنید و از قرار دادن دادههای حساس در URL خودداری کنید.
- مطمئن شوید url_rewriter.tags و تنظیمات محیط شما به درستی پیکربندی شدهاند.
- در صورت امکان، به روشهای جایگزین مانند کوکیها یا هدرهای اختصاصی ترجیح دهید.
در نهایت، اگر نیاز به مثالهای پیچیدهتر، ترکیب با session یا بررسی دقیق رفتار در نسخههای مختلف PHP دارید، میتوان مثالهای عملی و تستهای واحد (unit tests) مربوطه را بررسی و ارائه کرد.
آیا این مطلب برای شما مفید بود ؟



