0

بازنويسي URL ها با پارامترهاي نامحدود

 
amirpetrucci0261
amirpetrucci0261
کاربر طلایی1
تاریخ عضویت : تیر 1388 
تعداد پست ها : 27726
محل سکونت : http://zoomstar.ir/

بازنويسي URL ها با پارامترهاي نامحدود

بنا به دلايل بسياري شما نياز خواهيد داشت تا URL هاي صفحات وب سايت خود را بازنويسي كنيد. اين كار ميتواند براي سادگي و روان بودن URL ها بوي‍‍ژه URL هاي پر استفاده صورت بگيرد.
همچنين ممكن بنا به دلايل امنيتي نخواهد كاربران از نام صفحات و يا تكنولوژي سمت سروري كه از آن استفاده ميكنيد مطلع گردند.
مثلا به جاي داشتن چنين URL‌اي

http://example.com/index.php?act=news&code=view&id=3

بسيار ساده تر و جالب تر است اگر آن را بتوانيم به اين صورت در آوريم و استفاده كنيم :

http://example.com/news/view/1/

و يا حتي به اين شكل

http://example.com/news/view/1.html

اين كار در PHP به كمك يك تابع به نام mod_rewrite صورت ميگيرد و ميتواند URL ها را به صورت خودكار بازنويسي كند. البته شما ميتوانيد به كمك آن كاربر را به صفحه ديگر هدايت نماييد يا اين كه صفحات را به صورت پويا ايجاد كنيد.


مثال زير را در نظر بگيرد

RewriteEngine On
RewriteRule ^news/view/(.*).html$ index.php?act=news&code=view&id=$1

كد بالا در فايل .htaccess قرار داده شده است و كاري كه ميكند اين است كه موتور بازنويسي را فعال كرده و به آن ميگوييم كه بر اساس قاعده اي كه تعريف كرده ايم URL را بازنويسي كند.


البته mod_rewrite از regex براي عبارات قاعده بازنويسي اش استفاده ميكند:


^ به معناي آغاز جستجو و $ به معناي پايان آن است


(.*) به معنای جستجو برای 0 یا چند کاراکتر است.


برای هر پارامتری که اضافه میکنید میتوانید از یک متغیر $ استفاده نمایید و از آنجایی که ما فقط یک مورد (.*) داریم از $1 استفاده میکنیم.


سپس باید .html را نادیده بگیریم چرا که نقطه یک کلمه کلیدی در regex میباشد. قاعده بازنویسی بالا برای همه کاراکترها است و نه فقط کاراکترهای عددی و رشته ای. اما اگر بخواهیم آن را فقط به صورت عددی در آوریم :

RewriteRule ^news/view/([0-9]+).html$ index.php?act=news&code=view&id=$1

بنابراین این قاعده فقط زمانی اعمال میشود که اولین پارامتر عددی باشد و 1 کاراکتر یا بیشتر داشته باشد. چنانچه یک ورودی غیرعددی داده شود خطای 404 رخ خواهد داد مثلا URL زیر نامعتبر است و باعث بروز خطای 404 خواهد شد:

http://example.com/news/view/fdjghdfjkg.html

به منظور ایجاد URL های کاربر پسند برای همه سیستم وب سایت خود شما میبایست خطوط جدیدی نیز اضافه کنید که گاها کار دشواری است.اما آنچه که ما در اینجا معرفی میکنیم کار را بسیار ساده میکند. یک سیستم PHP که به شما اجاره میدهد پارامترهای نامحدودی را در URL خود داشتهب اشد بدون اینکه مجبور باشید از قواعد چند خطی بازنویسی URL استفاده نمایید.


تابعی به نام setInput() را در نظر بگیرید که همه داده های mod_rewritten را در $_GET قرار میدهد. ما از چنین تابعی استفاده خواهیم کرد. بنابراین باید کد زیر به فایل .htaccess اضافه شود.

RewriteEngine On
RewriteRule ^(.*).html$ index.php?string=$1

کاری که این کد انجام میدهد این است که مثلا عبارت:

http://example.com/news/view/my-title.html

را در واقع به آدرس زیر میفرستد:

http://example.com/index.php?string=news/view/my-title

در اینجا ما میباید:


1- $_GET['string'] را به توجه به کاراکتر / تکه تکه کنیم تا آرایه ای از داده ها داشته باشم


2- یک سیستم کلید/مقدار داشته باشیم که بتوانیم داده ها را توسط آن بیان کنیم


3- اولین پارامترمان را بعنوان عمل تعریف کنیم


4- $_GET را خالی کرده و همه آرایه را در $_GET قرار دهیم.


بنابراین از تابعی با این ساختار استافده میکنیم

function setInput()
{
}

قدم اول تکه تکه کردن رشته $_GET میباشد:

$input = explode( '/', $_GET['string'] );
We explode it with the directory seperator character.
Next up we have to assign a value to a key.
We'll use the for() loop to loop through our array.
for( $i = 0; $i < count( $input ); $i++ )
{
if( $i != 0 )
{
$input_array[ $input[ $i ] ] = $input[ $i + 1 ];
$i++;
}
}

دقت داشته باشید که درون حلقه تکرار for چک میکنیم که $input اولین پارامتر نباشد و در نهایت مقدار را در آرایه ای دیگر میریزیم به این ترتیب که کلید برابر محتوای پارامتر $I فعلی است و مقدار برابر محتوای $i بعدی.

$input_array['act'] = $input[0];

کاری که اینجا انجام میدهیم قراردادن کلید اولین پارامتر برای عمل است. یعنی مثلا در عبارت http://example.com/news.html کلید عمل برابر news است.

foreach( $input_array as $k => $v )
{
if( $v != '' )
{
$newinput[ $k ] = $v;
}
}
$input_array = $newinput;

البته در برخی شرایط شاید بهتر باشد پارامترهای خالی را حذف کنیم البته این کار اجباری نیست:

unset( $_GET );
$_GET = $input_array;

پس در نهایت چنین بگوییم که ما مقدار پارامترهای $_GET را درآورده و در یک آرایه جدید ریخته ایم و کد کامل تابعی که نوشته ایم به این شکل میباشد:

function setInput( $var = '' )
{
$input = explode( '/', $_GET['string'] );
for( $i = 0; $i < count( $input ); $i++ )
{
if( $i != 0 )
{
$input_array[ $input[ $i ] ] = $input[ $i + 1 ];
$i++;
}
}
$input_array['act'] = $input[0];
unset( $_GET );
$_GET = $input_array;
}
?>

پنج شنبه 11 آذر 1389  1:56 AM
تشکرات از این پست
alirezaco
alirezaco
کاربر برنزی
تاریخ عضویت : اسفند 1389 
تعداد پست ها : 20
محل سکونت : خراسان شمالی
سه شنبه 3 آبان 1390  6:05 PM
تشکرات از این پست
دسترسی سریع به انجمن ها