ایجاد: ۱۲:۲۸ ۱۳۹۱/۷/۵
ویرایش: ۱۸:۵۳ ۱۳۹۳/۱/۱۱

آموزش‌ها

»

تجزیه و ترکیب URL در PHP

تجزیه آدرس صفحه فعلی یا هر آدرس دیگر

در زبان پی اچ پی تابع کامل parse_url وجود دارد که تک‌تک عناصر یک url را تجزیه و قابل دسترس می‌کند:
<?php
$url = 'https://www.example.com/path/test?A=B#C';
var_dump(parse_url($url));
خروجی کد بالا، اینگونه است:
array(5) {
 [scheme] => https
 [host"]=> www.example.com
 [path]=> /path/test
 [query]=> A=B
 [fragment] => C
}
خب همانطور که از کد بالا مشخص است، تابع parse_url برای تجزیه یک آدرس است. اما آدرس صفحه فعلی را چگونه می‌توان تشخیص داد؟
در آرایه $_SERVER نیز بخش‌های مختلف آدرس صفحه فعلی گنجانده شده است:
$_SERVER['SERVER_NAME'] نام دامنه
$_SERVER['REQUEST_URI'] عبارت پس از نام دامنه

نکته 1: دقت کنید که هش (#) و آنچه بعد از آن است، همراه request به سرور ارسال نمی‌شود مگر آنکه از طریق جاوا اسکریپت عبارت پس از هش خوانده شده و به عنوان یک پارامتر مجزا به صفحه فعلی شما ارسال شود.

نکته 2: دقت کنید که برخی موارد موجود در آرایه $_SERVER شبیه هم است اما برخی از آنها بهتر از دیگری است. این مطلب را ببینید.
مثلا $_SERVER['SERVER_NAME'] اگر درست تنظیم شده باشد، بهتر از $_SERVER['HTTP_HOST'] است چون اولی پاک و مطمئن است اما دومی هم ممکن است غلط باشد و هم آلوده به کدی برای injection و ... که برای توضیح بیشتر می‌توانید این مطلب یا این پاسخ را مطالعه کنید.

نکته 3: همچنین موارد جالب دیگری در آرایه $_SERVER وجود دارد از جمله آدرس صفحه ارجاع (صفحه قبلی که کاربر از آن صفحه، به صفحه فعلی آمده است) که به صورت $_SERVER['HTTP_REFERER'] در دسترس است و کاربردهای فراوانی دارد. یکی از کاربردهای آن پیشگیری از حملات CSRF است و کاربرد دیگر آن، ارسال کاربر به صفحه پیشین، پس از ثبت اطلاعات فرم ارسالی است.

نکته 4: همانطور که در بحث امنیت به دانشجویان عزیز می‌گویم، نباید به عناصر موجود در آرایه $_SERVER اعتماد کنید. مثلا تمام عناصری که به صورت $_SERVER['HTTP_*****'] هستند، همگی باید آلوده فرض شوند چون توسط سرآیند request می‌آیند و در هنگام کار با دیتابیس یا چاپ آنها باید ابتدا اقدامات لازم را برای حفظ امنیت انجام داد.

دسترسی به پارامترهای ارسال شده نیز با آرایه $_GET انجام می‌شود اما اگر پارامترهای ارسالی به صورت یک رشته وجود داشته باشد (سریالایز شده باشد)، آنگاه لازم است با کمک تابع parse_str پارامترهای آن استخراج شود:

$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

ترکیب عناصر یک آدرس برای ساخت یک آدرس

زمانی که عناصر و بخش‌های یک آدرس را داشته باشیم، مثل هر رشته دیگری در php با کمک نقطه می‌توان آن را ترکیب کرد. مثلا آدرس صفحه فعلی چنین می‌شود:
echo 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
اما یکی از نیازهای متداول برنامه‌نویسان، ترکیب پارامترهای ارسالی به صفحه فعلی، جهت ایجاد لینکهای صحیح در پاسخ است که با استفاده از تابع http_build_query می‌توان برای ترکیب عناصر استفاده کرد:
$data = array(
 'foo'=>'bar',
 'php'=>'hypertext processor');

echo http_build_query($data);
// foo=bar&php=hypertext+processor
در صورتی که آرایه ورودی به تابع http_build_query ایندکس عددی داشته باشد و ما بخواهیک که پیشوند خاصی به آن اضافه کنیم، می‌توان از عناصر اختیاری دیگری که در لینک فوق اشاره شده، استفاده کرد. مثلا:
$data = array('boom', 'cow' => 'milk');

echo http_build_query($data, 'myvar_', '&');
// myvar_0=boom&cow=milk
همانطور که مشخص است، پارامتر اختیاری آخر کد فوق هم کاراکتر چسباننده عناصر آرایه را تعیین می‌کند.
یادداشت‌های مرتبط
  1. سرویس های آنلاین رایگان برای نوشتن، تست و بهینه سازی کدهای برنامه نویسی
  2. لیست مواردی که برای امنیت برنامه PHP لازم است چک شود
  3. کاربردهای CURL در پی اچ پی
  4. تشخیص و کشف نوع، نام و مشخصات مرورگر کاربران سایت
  5. قلمرو متغیرها در پی اچ پی و جاوا اسکریپت
  6. دسترسی کامل به عناصر آدرس در جاوا اسکریپت
  7. ارسال و دریافت ایمیل با PHP و ساختن اکانت ایمیل
  8. نکاتی در مورد نسخه جدید PHP 5.5
  9. انواع راه های تولید کد QR با پی اچ پی و جاوا اسکریپت

مدیریت

نام وسیله

اعتبار ورود

نام کاربری

رمز عبور

رمز یکبارمصرف

... لیست تمام آموزش‌ها

تبلیغات

ربات‌های تلگرامی:
مجموعه ربات‌های تلگرامی ما برای ساده‌تر کردن کار با تلگرام و مدیریت کانال
دامنه‌های فروشی:
دامنه‌های زیر مربوط به ما یا مشتریان ماست که قابل واگذاری هستند. در صورت تمایل به داشتن یکی از آنها، با این اکانت تلگرامی مکاتبه نمایید.

دامنه‌هایی که می‌تواند مصرف تخصصی داشته باشد:
AnyDesk.ir, Firebase.ir, Angularjs.ir, 9px.ir alAdmin.ir, iQore.ir notion.ir, 3dn.ir,

دامنه‌هایی که می‌تواند مصرف فرهنگی/مذهبی داشته باشد:
mavaez.ir, 2aha.ir, babolelm.ir, mahjoor.ir

دامنه‌هایی که می‌تواند مصرف شخصی/عمومی داشته باشد:
azizami.ir, 90blog.ir