article

نحوه دوباره نویسی لینک (URL Rewrite) در htaccess

web-url-rewrite

دوباره نویسی لینک ها (آدرس های اینترنتی) یا (url rewrite)، تکنیکی است که اغلب توسط آگاهان علم سئو (Search Engine Optimization)، توصیه شده و مورد استفاده قرار می گیرد، چرا که امروزه اغلب آدرس های اینترنتی به دلیل اینکه به صورت داینامیک و مبتنی بر پایگاه داده ایجاد می شوند، دارای متغیر ها و مقادیر مربوط به پرس و جوی پایگاه داده هستند، مثلا در بیشتر سیستم هایی که به زبان php یا asp نوشته می شوند، در بین لینک ها باید از علامت ? و = استفاده شود و این چیزی است که به گفته آگاهان، علم سئو آن را نمی پسندد، البته اینکه واقعا لینک های داینامیک در مقابل لینک های استاتیک تا چه میزان روی عملکرد یک سایت تاثیر گذار است، خود جای بحث دارد، اما به دلایل دیگر شاید هنوز ضرورت استفاده از لینک های استاتیک احساس شود، به هر صورت این مطلب را به آموزش نحوه دوباره نویسی لینک (url rewrite) در htaccess اختصاص داده ایم.

ضرورت استفاده از لینک های استاتیک


شاید در ذهن خیلی از برنامه نویسان وب و مدیران سایت ها، این سوال وجود داشته باشد که آیا باید حتما از لینک های استاتیک استفاده شود؟ پاسخ به این پرسش بستگی زیادی به هدف و میزان تسلط و آشنایی شما با برنامه ای است که از آن برای مدیریت سایت خود استفاده می کنید، دلایلی برای استفاده از لینک های استاتیک ارائه می شود از جمله اینکه به لحاظ حفظ امنیت این گونه لینک ها از ضریب اطمینان بالاتری برخوردارند، چرا که لینک های داینامیک معمولا ساختار مشخصی دارند و این ساختار در معرض دید کاربران است، اما با دوباره نویسی آدرس ها، ساختار لینک ها تا حدود بسیار زیادی پیچیده و نامفهوم می شود، دلیل دیگر کوتاه شدن لینک و حذف علامت های ?، & و = از آن است، البته پیش تر تصور بر این بود که موتورهای جستجو قادر به ایندکس صفحات داینامیک نیستند که البته در حال حاضر این تصور کاملا اشتباه است، تمام موتورهای جستجوی معروف به خوبی لینک های داینامیک را ایندکس می کنند، منتها لینک های استاتیک به دلیل کوتاه تر بودن و حذف موارد زائد، توصیه شده اند، مزیت بعدی که گفته می شود این است که لینک های استاتیک راحت تر به خاطر سپرده می شوند و در موتور های جستجو، آمار کلیک بهتری کسب می کنند، البته قسمت اول این گفته بستگی زیادی به تعداد کاراکتر یک لینک دارد (هر چه کوتاه تر، بهتر) و قسمت دوم نیز بین یک لینک داینامیک با پارامترهای مناسب و کوتاه و یک لینک استاتیک مشابه، آنچنان فرق محسوسی نیست؛ حال با این تفاسیر کدام روش را انتخاب کنیم؟ همانطور که گفتیم این امر بستگی زیادی به هدف شما دارد، اگر به فرض رقابت با سایرین از لحاظ جذب بازدید کننده برایتان اهمیت زیادی دارد و سایر اصول مربوط به بهینه سازی را نیز رعایت کرده اید، توصیه می کنیم این یک مورد را هم فرا بگیرید و با رعایت اصول و جوانب فنی، از آن استفاده نمائید، اما اگر به طور مثال یک سایت اداری یا شخصی را مدیریت می کنید و جوانب امنیتی پایگاه داده را هم رعایت کرده اید، دوباره نویسی لینک ها چندان ضرورتی نخواهد داشت، کما اینکه بسیاری از سایت های موفق هستند که از لینک های داینامیک استفاده می کنند و مشکل خاصی نیز برای آنها از این لحاظ پیش نمی آید، بنابراین همه چیز بستگی به خودتان دارد.

نکاتی که در دوباره نویسی  لینک (url rewrite) باید رعایت کنیم


باید یادآور شویم که دوباره نویسی لینک های داینامیک (url rewrite) کار حساسی است و باید با دقت و تسلط کامل انجام شود، اشتباه در این خصوص ممکن است باعث بروز مشکلاتی از جمله ایجاد مطالب تکراری (duplicate content) و یا موجب اختلال در عملکرد سایت شود، البته خوشبختانه تغییرات فایل htaccess به سرعت قابل بازگشت به حالت سابق است، چون سرور در هربار پردازش اطلاعات، آن را به طور مجدد فرا می خواند؛ اما با این حال این کار باید با در نظر گرفتن تمام احتمالات و آزمایش های قبلی صورت گیرد.

آشنایی با mod_rewrite در سرور Apache


دوباره نویسی یا  rewrite لینک ها در سرورهای لینوکسی Apache با ماژولی به نام mod_rewrite انجام می شود، این ماژول تقریبا یکی از محبوب ترین، قدرتمند ترین و پرکاربردی ترین ها در این نوع سرورها محسوب می شود، قدرت mod_rewrite در حدی است که هر نوع دستکاری در ساختار لینک های سایت توسط آن میسر می شود، اصول کار این ماژول بر اساس عبارات با قاعده یا Regular Expressions است که قوانین خاصی در آن با این روش تعریف می شود (RewriteRule)، اگرچه گستره قواعد و خاصیت های این ماژول بسیار زیاد است، اما برای استفاده های معمول، می توان با فراگیری چند تکنیک ساده، نیازهای خود را برطرف نمود؛ این قابلیت در بیشتر سرورهای Apache به صورت پیش فرض فعال است، اما اگر هاست شما از آن پشتیبانی نمی کند، می توانید موضوع را با پشتیبان خود مطرح کنید، نصب و استفاده از این ماژول بسیار آسان و پرکاربرد است و معمولا هاست ها آن را فعال می کنند.

mod_rewrite در سرور ویندوز


در سرورهای ویندوز، ماژول mod_rewrite وجود ندارد، ولی با پلاگین های دیگری می توان عملیات دوباره نویسی لینک ها را شبیه سازی کرد، به فرض پلاگینی با نام  ISAPI_Rewrite در سرورهای ویندوز می تواند رهگشا باشد.

نحوه دوباره نویسی لینک (url rewrite)


برای دوباره نویسی آدرس های وب، قبل از هر چیز به یک فایل متنی ساده به نام htaccess. (به همین صورت، با پسوند htaccess و بدون نام) در ریشه سایت خود (پوشه www یا public_html) نیاز خواهیم داشت، اگر فایل htaccess. به طور پیش فرض در سرور شما وجود ندارد، می توانید به راحتی آن را ایجاد کنید، دقت کنید که نقل و انتقال این فایل به سرور باید به صورت ASCII انجام شود، نه باینری (BINARY)، سپس مطابق نیاز خود باید دستوراتی که در ادامه خواهیم گفت را در آن درج و تنظیم نمائید.
اجازه دهید آموزش را با یک مثال ادامه دهیم، فرض کنید آدرس زیر را می خواهیم دوباره نویسی کنیم.
http://yoursite.com/index.php?q=home
هدف ما این است که آدرس بالا را به صورت زیر درآوریم، یعنی با وارد کردن آدرس زیر، در واقع سرور پارامترهای لینک بالا را در پس زمینه و به طور پنهانی دریافت کند.
http://yoursite.com/home
بدین منظور ابتدا ماژول mod_rewrite را روشن می کنیم، سپس از قوانین آن استفاده کرده و با عبارات با قاعده (در ادامه بیشتر خواهیم گفت)، یک قانون (RewriteRule) می نویسیم تا وقتی سرور لینک درخواستی را با آن مطابقت داد، قانون ما عمل کرده و لینک اصلی در پس زمینه دریافت شود.
RewriteEngine On
RewriteRule ^home /index.php?q=home [NC,L]
با کپی عبارت بالا در فایل htaccess. و قرار دادن آن در ریشه سایت، سرور آدرس دریافتی را بررسی و اگر با قانون تعریف شده مطابقت داشته باشد، لینک اصلی را تعریف می کند، اگر این کار را درست انجام ندهید، معمولا خطای داخلی سرور با کد 500 یا همان HTTP Error 500 Internal server error را دریافت خواهید کرد.
قانون بالا از دو قسمت تشکیل شده است، در بخش اول شرایط لینک دریافتی بررسی می شود، اگر با الگو (pattern) مطابقت داشت، لینک استاتیک دریافتی تبدیل به لینک داینامیک قسمت دوم (substitution یا جانشین) می شود، در واقع اگر در لینک استاتیک عبارت home وجود داشته باشد، سرور آن را به صورت  index.php?q=home شناسایی می کند؛ علامت های شبیه ^ معنی خاصی دارند که به آنها در اصطلاح عبارات با قاعده یا Regular Expressions می گویند، حروف [NC,L] نیز معانی خاصی در زمینه نحوه پردازش قوانین دارند و با این روش نوع اعمال قوانین را به سرور تفهیم می کنیم، به طور مثال NC به معنی case-insensitive یا حساس نبودن به حروف بزرگ و کوچک است، یا حرف L به معنی Last و آخرین است، یعنی اگر این قانون اجرا شد، بقیه قوانین بعد از آن نادیده گرفته می شوند، به این حروف در اصطلاح نشانه ها یا Flags می گویند.

توضیح مختصر عبارات با قاعده در htaccess


برای کاربرد صحیح قوانین دوباره نویسی، باید آشنایی مختصری با عبارات با قاعده داشته باشیم، در زیر چند عبارت پرکاربرد همراه معنی آن ذکر شده است.
Anchors یا لنگرها: لنگرها شروع و پایان یک رشته را مشخص می کنند، به فرض الگوی زیر، به معنی کلیه لینک هایی است که بعد از آدرس سایت، قسمت دوم آنها، با اعداد (0 تا 9) شروع می شود.
^([0-9]+)/
الگوی بالا با لینک فرضی زیر مطابق خواهد بود.
http://www.yoursite.com/143231/
علامت ^ هر آنچه پیش از آن آمده باشد را شامل می شود، همچنین است علامت $ که به معنی پایان یک رشته است.
دسته بندی ها یا Character Classes: نوع دیگر از حروف با قاعده با علامت های w ،s ،W ، d و... (حساس به حروف بزرگ یا کوچک) تعریف می شوند، به فرض علامت d\ با اعداد (0-9) مطابقت دارد، یا w\ به معنی حروف و اعداد انگلیسی است، همچنین W\ شامل همه چیز به جزء حروف و اعداد می شود، s\ (با حروف کوچک) نیز به معنی فضای خالی است.
تاکیدات یا Assertions: یک نوع دیگر از عبارات با قاعده، تاکیدات هستند، به اینصورت که اگر به فرض لینک دریافتی را برای وجود حرف a بررسی کرده و در عین حال بخواهیم بعد از حرف a کلمه فرضی book نیز نیامده باشد، خواهیم نوشت:
[^\S]*a(?!book)[^\S]*
قسمت مربوط به حرف S (با حروف بزرگ) در اینجا به معنی عدم فاصله خالی در عبارت است، سپس وجود حرف a بررسی می شود و بعد از آن، عدم وجود کلمه book و سپس نبودن فضای خالی، اگر لینک ارسالی از این الگو پیروی کند، قسمت دوم قانون اجرا می شود.
گروه و حدود: یکی از پر کاربرد ترین عبارات با قاعده گروه ها و حدود هستند، به فرض اگر بخواهیم بررسی کنیم که آیا در رشته ای، عباراتی بین اعداد 0 تا 9 یا حروف a تا z قرار دارد یا خیر، خواهیم نوشت:
[^A-Za-z0-9]
علامت یا (|): علامت یا (|) نیز در عبارات با قاعده کاربرد زیادی دارد، به فرض عبارت زیر به معنی وجود حروف web یا goo در رشته ارسالی است.
(web|goo)
در واقع عبارات با قاعده تنوع زیادی دارند و یادگیری تمام آنها در این مطلب نمی گنجد، در اینجا هدف فقط، آشنایی نسبی شما با عملکرد و منظور از به کارگیری آنها است.

چند مثال کاربردی برای دوباره نویسی آدرس های وب


به دلیل پیچیده به نظر رسیدن موضوع در نگاه اول، شاید بهترین روش برای یادگیری نحوه دوباره نویسی لینک ها در htaccess، استفاده از مثال های کاربردی باشد، با این شیوه هم با نحوه اعمال دستورات آشنا خواهیم شد و هم می توانیم از مثال ها، در برنامه خود استفاده کنیم.

- انتقال آدرس از index.html به index.php


RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html
RewriteRule ^index\.html$ http://yoursite.com/index.php [R=301,L]
RewriteCond در واقع نقش دستورات شرطی را در mod_rewrite بازی می کند، همانطور که ملاحظه می کنید، پارامتر THE_REQUEST نیز در این ماژول قابل دسترسی است، این پارامتر همان قسمت بعد از آدرس اصلی سایت، در یک لینک درخواستی است (در اینجا index.html)، کد بالا به این نحو تفسیر می شود:
اگر در لینک درخواستی، حروف A تا Z یا اعداد 0 تا 9 وجود داشت و برابر با index.html بود، قانون بعدی اجرا شده و با R=301 که به معنی ریدایرکت همیشگی یا (Moved Permanently) است، کاربر به آدرس http://yoursite.com/index.php منتقل شود.
علامت $ یک نوع لنگر و به معنی پایان یک عبارت است (برعکس ^ و در انتهای عبارت).

- دوباره نویسی آدرس داینامیک با یک پارامتر متنی


در این مثال یک آدرس داینامیک را که یک متغیر متنی دارد، دوباره نویسی می کنیم.
RewriteEngine On
RewriteRule ^category/([^/]+) /?category=$1 [NC,L]
در این مثال لینک فرضی http//yoursite.com/category/learn در سرور به صورت http//yoursite.com/?category=learn تبدیل می شود، همانطور که ملاحظه می کنید، قسمت دوم الگو (کلمه learn) به صورت 1$ برای حالت داینامیک تنظیم می شود که این یک قانون تعریف شده در mod_rewrite برای تعیین متغیر ها و مقادیر آنها است.

- دوباره نویسی آدرس داینامیک با یک پارامتر عددی


در این مثال یک آدرس داینامیک را که یک متغیر عددی دارد، دوباره نویسی می کنیم.
RewriteEngine On
RewriteRule ^category/([0-9]+) /?category=$1 [NC,L]
به فرض لینک http//yoursite.com/category/5 به صورت http//yoursite.com/?category=5 دریافت می شود.

- دوباره نویسی یک آدرس داینامیک با دو پارامتر متنی و عددی


در این مثال یک آدرس داینامیک را که دو متغیر متنی و عددی دارد، دوباره نویسی می کنیم.
RewriteEngine On
RewriteRule ^category/([0-9]+)/([^/]+) /?category=$1&title=$2 [NC,L]
دستور بالا به فرض لینک http//yoursite.com/category/5/learn-web را به صورت http//yoursite.com/?category=5&title=learn-web دوباره نویسی خواهد کرد.

- انتقال از آدرس های غیر اصلی به آدرس اصلی


در مثال زیر، دستوری را تنظیم کرده ایم که با آن، اگر کاربر در لینک ورودی عبارت www را تایپ نکرده باشد، او را به آدرس با www هدایت کنیم.
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.yoursite\.com$ [NC]
RewriteRule .? http://www.yoursite.com%{REQUEST_URI} [R=301,L]
دستورات HTTP_HOST، REQUEST_URI مربوط به سربرگ های HTTP و سرور Apache هستند، نمونه آنها را در php نیز دیده ایم، به فرض HTTP_HOST در واقع آدرس اصلی سایت است، یا REQUEST_URI قسمت بعد از آدرس سایت است که توسط کاربر درخواست می شود.
همانطور که گفتیم، دوباره نویسی لینک ها باید با دقت بالا انجام شود، اشتباه در نحوه چینش قانون ها، مخصوصا در مورد قوانین مشابه، ممکن است موجب بروز اختلال در عملکرد سایت شده، یا سبب بروز مشکل مطالب تکراری (duplicate content) گردد، بهتر است در این خصوص بر تکنیک ریدایرکت 301 (Moved Permanently) نیز تسلط کافی داشته باشید و قبل از اعمال تغییرات در ساختار لینک های سایت، حتما همه ی جوانب را تست کنید.
sectionدسته بندی: مهارتهای وب » بهینه سازی
related مطالب بیشتر:
» چگونه سایت یا وبلاگ را برای موتورهای جستجو بهینه سازی کنیم؟
» رتبه بندی الکسا (Alexa) چیست و چقدر اهمیت دارد؟!
» چرا برخی سایت ها و وبلاگ ها رتبه الکسای بهتری دارند؟
» پیج رنک چیست و چگونه می توان آن را افزایش داد؟
» مقایسه خطای 404 و کد 301 ریدایرکت (Redirect)
commentنظرات (۱۶۰ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: مهران
زمان: ۱۵:۳۱:۲۹ - تاریخ: ۱۳۹۲/۱۱/۲۹
سلام خسته نباشید.
من هر کاری می کنم نمیشه
http://ariaandishan.com/index.html
را به
http://ariaandishan.com/home
تبدیل کنم .
لطفا کمکم کنید..
پاسخ: 
سلام
از الگوی نمونه زیر استفاده کنید:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html
RewriteRule ^index\.html$ http://yoursite.com/home [R=301,L]
نویسنده: مازیار
زمان: ۱۵:۴۰:۱۰ - تاریخ: ۱۳۹۳/۰۲/۰۱
سلام
من می خوام بعد از ادرس سایت هرچی وارد می شه اول برسی کنه اگه کلمه های مثل home, message و غیره نبود اون صفحه رو باز کنه که مثلا پروفایل کاربری هست
RewriteEngine On
RewriteRule ^([^/]+) /a.php?a=$14 [NC,L]
از این کد استفاده کردم ولی ارور 500 داد میشه منو راهنمایی کنید؟
ممنون از سایت خوبتون
پاسخ: 
سلام
نکته اول عدد 14 است که باید 1 باشد!
نکته دوم اینکه کد استفاده شده برای هدف شما کاربرد ندارد، معنی کد شما این است که هر چیزی به جز علامت / بعد از آدرس سایت قرار گرفت، به عنوان پارامتر برای قسمت دوم در نظر گرفته شود و لذا شرطی وجود ندارد، نمونه روش صحیح (تست نشده):
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/home|message
RewriteRule ^([^/]+) /a.php?a=$1 [NC,L]
نویسنده: مازیار
زمان: ۰۰:۱۴:۴۶ - تاریخ: ۱۳۹۳/۰۲/۰۳
سلام
شرمنده نکته 1 اشتباه چاپی بود
همچنان با ارور 500 مواجه هستم و نمی دونم مشکل از کجای کار می تونه باشه
میشه از شما تقاضا کنم این مورد را بررسی نمایید.
واقعا شرمنده شما هستم.
تشکر از پیگیری شما
پاسخ: 
سلام
فایل htaccess را به صورت zip شده به آدرس ایمیل ما (درج شده در بخش تماس با ما) ارسال کنید تا بررسی کنیم، نتیجه را نیز از طریق ایمیل پیگیر باشید.
نویسنده: مازیار
زمان: ۱۹:۰۱:۰۲ - تاریخ: ۱۳۹۳/۰۲/۰۵
سلام
اقا ممنون از لطف شما.
مشکل حل شد
کد باید به این صورت در بیاد تا کار بده
RewriteEngine On
|RewriteCond %{REQUEST_URI} !^/home|message|a
RewriteRule ^([^/]+) /a.php?a=$1 [NC,L]
یعنی باید خود صفحه مذکور به شرط لود نشدن اضافه بشه
پاسخ: 
سلام
خواهش می کنیم.
به نظر مشکل کد قرار گرفتن در یک حلقه بی پایان بود (یعنی سرور مدام فایل a.php را بارگذاری می کرد)، نکته ای که از قلم افتاده بود!
نویسنده: hesam
زمان: ۰۱:۴۲:۲۴ - تاریخ: ۱۳۹۳/۰۲/۲۴
بسیار زیبا ممنون از لطف شما
نویسنده: yaghob
زمان: ۱۲:۰۴:۵۱ - تاریخ: ۱۳۹۳/۰۳/۰۵
سلام خسته نباشید دوست عزیز
من این کدهای بالا رو انجام دادم ولی فقط وقتی در ادرس بار تایپ میکنم انجام میشه ولی وقتی که بر روی لینک کلیک میکنم دوباره ادرس تغییر میکنه به شکل اولیه
مثلا
ادرس www.nabdownload.com/index.php?do=reg
رو تبدیل کردم به www.nabdownload.com/reg
فقط زمانی که در ادرس بار تایپ میکنم درست کار میکنه
ولی وقتی بر روی لینک مربوط کلید کنی دوباره ادرس برمیگرده به www.nabdownload.com/index.php?do=reg
لطفا راهنمایم کنید
اگه بخوام ادرس زیر تبدیل کنم
www.nabdownload.com/index.php?do=news&nid=66
چطوری تبدیل کنم
ممنون میشم اگه راهنمایم کنید
پاسخ: 
سلام
دستورات فایل htaccess. و ساختار سایت شما باید به صورت آنلاین بررسی شود، بدون آزمایش و خطا نمی توان گفت که مشکل از کجا است، شاید یک مورد خیلی جزئی باعث بروز مشکل شود، در مورد بخش دوم سوال نیز با ذکر نمونه در مطلب آموزش داده شده.
نویسنده: داوود
زمان: ۱۱:۲۹:۰۴ - تاریخ: ۱۳۹۳/۰۳/۲۷
سلام.
من میخوام آدرس :
http://localhost/taranweb/Articles//Article/20

رو به
http://localhost/taranweb/Articles/?Article=20
تبدیل کنم.
چجوری میشه این کار رو کرد؟
پاسخ: 
به نظر یک / در آدرس اول شما اضافه است؟!
RewriteEngine On
RewriteRule ^taranweb/Articles//Article/([0-9]+) /taranweb/Articles/?Article=$1 [NC,L]
نویسنده: ehsan
زمان: ۱۱:۰۶:۵۴ - تاریخ: ۱۳۹۳/۰۴/۰۱
سلام به خاطر مطلب خیلی خوبتون ممنون
میشه برا کاراکترهای فارسی بگین به چه صورت در rewrite باید قرار بدم
با تشکر
پاسخ: 
سلام
اصولا استفاده از حروف فارسی در آدرس URL توصیه نمی شود، بهتر است از استاندارد یونیکد UTF-8 استفاده کنید که در آن حروف فارسی تبدیل به کاراکترهای خاص می شوند (اما در نوار آدرس مرورگر به صورت کلمات قابل خوانا هستند)، این کار در PHP با توابعی مانند rawurlencode انجام می شود، به هر حال اگر لینک فارسی است، هم می توانید به همان طور فارسی استفاده کنید، هم مانند کاراکترهای انگلیسی از عبارت باقاعده
([^/]+) 
استفاده کنید.
نویسنده: میثم
زمان: ۱۶:۰۵:۲۵ - تاریخ: ۱۳۹۳/۰۴/۰۸
سلام
ببخشید من با کل موضوع یه مشکلی دارم!
من با EasyPHP کار میکنم.
فایل httpd.conf رو ویرایش کردم و علامت # رو از این گزینه ها برداشتم
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
و بعد Easyphp رو restart کردم
سایت من به این شکله
http://localhost/site/index.php?p=2
حالا میخوام به این شکل در بیاد:
http://localhost/site/index/2
فایل httacces. رو با محتوای زیر ساختم و در ریشه قرار دادم
RewriteEngine On
RewriteRule ^site/index/([0-9]+) /site/index.php?p=$1 [NC,L]
قاعدتا الان نباید مشکلی باشه
ولی وقتی تو آدرس بار میزنم
http://localhost/site/2
ارور میده که
The requested URL /site/index/2 was not found on this server.
میشه بفرمایید کجای کار رو دارم اشتباه میرم یا کجا رو انجام ندادم؟
مرسی.
پاسخ: 
سلام
حل مشکل نیاز به تست دارد، اما به نظر، به هر دلیل mod_rewrite به درستی در برنامه شما فعال نشده، تا جایی که اطلاع داریم، در برنامه EasyPHP باید علاوه بر اقدامات بالا، پارامتر دیگری به نام
AllowOverride None
را به
AllowOverride All
تغییر دهید، علت بعدی می تواند از تنظیم اشتباه دستورات htaccess با توجه به موقعیت فایل ها و آدرس درخواستی باشد.
نویسنده: میثم
زمان: ۰۴:۴۰:۳۹ - تاریخ: ۱۳۹۳/۰۴/۰۹
سلام مجدد
مرسی ، بله باید این رو تغییر میدادم.
الان این رو که در آدرس بار می زنم درست میاد
http://localhost/site/index/2
ولی این رو میزنم
http://localhost/site/index.php?p=2
دیگه چیزی نمیاد ،
روالش به همین صورته؟ یعنی وقتی تبدیل میشه دیگه لینک های اول کار نمیکنن؟
=====
سوال دوم
چطور میشه لینک های آدرس بار رو در یک string ذخیره کرد؟
یعنی مثلا وارد یه صفحه ای میشیم بتونیم آدرس کامل (یا بخشی از آدرس) اون صفحه رو هم تو یه متغیر داشته باشیم؟
مرسی.
پاسخ: 
سلام
- خیر! اگر دستورات را به نحو صحیحی نوشته باشید، چه در حالت داینامیک و چه در حالت استاتیک، سرور متناسب با آدرس درخواستی نتیجه را نمایش می دهد، باید توجه کنید که حتی لینک های داینامیک نیز ابتدا با الگوی نوشته شده در فایل htaccess تطبیق داده می شوند، به عبارتی تمام آدرس های درخواستی با الگوهای فایل htaccess تطبیق داده می شوند و در صورت عدم تطبیق، در نهایت به صورتی که درخواست شده پردازش می شوند (رفع مشکل نیاز به تست دارد).
- برای دریافت آدرس لینک درخواستی از سرور می توانید از تابع زیر استفاده کنید:
function pageURL(){
$pageURL = 'http';
if($_SERVER["HTTPS"] == "on"){
$pageURL .= "s";
}
$pageURL .= "://";
if($_SERVER["SERVER_PORT"] != "80"){
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else{
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}

return $pageURL;
}
$page_url = pageURL();
نویسنده: میثم
زمان: ۰۴:۴۷:۴۸ - تاریخ: ۱۳۹۳/۰۴/۰۹
راستی خیلی ممنون میشم یه مقاله ای هم در رابطه با MVC در PHP ارائه بدید.
یا یه منبع مناسب انگلیسی یا فارسی معرفی کنید برای یادگیری چون هرچی سرچ کردم اصلا آموزش ها کامل نبودن.
====
اینم الان یادم افتاد ، چطور میشه مثل گوگل وقتی سرچ میکنیم ، زمان سرچ رو هم داشته باشیم. ( زمانی که طول کشیده تا سایت مورد نظر رو پیدا کنه)
البته سایت شما هم داره این مورد رو.
مرسی
پاسخ: 
- همان طور که می دانید مبحث MVC یا Model View Controller یک شیوه یا الگو (pattern) جهت خلق نظامند برنامه های کاربردی وب است که خود مبتنی بر مباحث شی گرایی است، به همین دلیل ارائه آموزش های خاص برای آن تا زمان طرح مباحث برنامه نویسی شی گراء ممکن نیست، در وب آموزش های نسبتا قابل فهمی (عموما به زبان انگلیسی) وجود دارد، البته می توانید الگوی خاص خود را داشته باشید و اجباری به رعایت اصول MVC نیست (هرچند درک مبانی آن مفید خواهد بود).
- برای محاسبه زمان پردازش دستورات PHP می توانید از نمونه کد آماده زیر استفاده کنید.
تکه کد زیر را در ابتدای صفحات PHP قرار دهید:
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
سپس در همان صفحه تکه کد زیر را در انتهای دستورات قرار دهید:
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
?>
مبنای کد ساده و به راحتی قابل سفارشی سازی است.
نویسنده: علی
زمان: ۰۹:۳۴:۵۰ - تاریخ: ۱۳۹۳/۰۴/۲۰
سلام خسته نباشی
من یه بخش تو سایتم دارم که به کاربرا پروفایل اختصاص میده آدرس پروفایل هر کاربر به این شکل هستش
http://localhost/?user=admin
آدرس رو به این صورت تغییر دادم
RewriteRule ^$ z.p.php
که به این شکل در اومد
?user=admin
من میخوام آدرس به این شکل تغییر پیدا بکنه
http://localhost/admin
تو فایل z.p.php هم که صفحه پروفایل رو نشون میده
کدها به این صورت هستش
ستاره دار رو توجه کن
require_once('tools/profile/db.php');
@ $user=$_GET['user']; ***
$conn = db_connect();
$result = $conn->query("select * from aliresalat_users where username = '$user'"); ***
$num_results = $result->num_rows;
for ($i=0; $i <$num_results; $i++)
{
$row = $result->fetch_assoc();

$userfullname=$row['userfullname'];
$email=$row['email'];
$usertel=$row['usertel'];
$userwebsite=$row['userwebsite'];
$ostan=$row['ostan'];
$keshvar=$row['keshvar'];
$shahr=$row['shahr'];
$jensiyat=$row['jensiyat'];
$tavalod=$row['tavalod'];
$alaghe=$row['alaghe'];
$avatar=$row['avatar'];
$laghab=$row['laghab'];
$usertel=$row['usertel'];
$useronline=$row['useronline'];
$username=$row['username'];
$userid=$row['userid'];
$chkProfile=$row['chkProfile'];
}
if($num_results)
{
اینجا هم فکر کنم باید یه تغییراتی داده بشه
چون ادرس به این شکل هستش
?user=admin
و همون طور که گفتم میخوام این شکلی بشه
http://localhost/admin
منتظر پاسخ هستم سپاس
پاسخ: 
سلام
- برای تبدیل آدرس های داینامیک به استاتیک نیازی به دستکاری کدهای PHP نیست، چون تفاوت خاصی بین حالت داینامیک و استاتیک نیست (در واقع لینک استاتیک اگر به درستی برای آن RewriteRule نوشته شود، معادل لینک داینامیک است و همان پارامترها را ارسال می کند)
- در اینجا نوشتن یک RewriteRule مناسب در htaccess نقش کلیدی دارد، می توانید برای حالت
http://localhost/admin
به صورت زیر دستور بنویسید:
RewriteEngine On
RewriteRule ^([^/]+) /z.p.php?user=$1 [NC,L]
این روش چون هیچ کلید واژه ای در لینک شما نیست، توصیه نمی شود و ممکن است در حالت های دیگر موجب بروز اختلال شود، بهتر است لینک به صورت زیر باشد:
http://localhost/user/admin
و به صورت نمونه زیر دریافت شود:
RewriteEngine On
RewriteRule ^user/([^/]+) /z.p.php?user=$1 [NC,L]
در این حالت عبارت کلیدی user باعث می شود تا تنها آدرس هایی که به دایرکتوری فرضی user ختم می شوند شامل دستور RewriteRule شوند.
نویسنده: علی
زمان: ۱۰:۳۹:۵۵ - تاریخ: ۱۳۹۳/۰۴/۲۰
روش اول رو امتحان کردم
RewriteRule ^([^/]+) /z.p.php?user=$1 [NC,L]
http://localhost/admin
بعد از ورود به این شکل در میاد
http://localhost/admin/?user=admin
و خطای 500 میده روش دوم مشکلی نداشت ولی پیشنهادتون چیه واسه مشکل روش اول چون به هر حال پروفایل به نظر من که اصولا باید به صورت روش اول نشون داده بشه
ممنون بابت جواب سریع
نویسنده: علی
زمان: ۱۱:۱۶:۰۰ - تاریخ: ۱۳۹۳/۰۴/۲۰
خوب مشکل رو حل کردم rule به این شکل در میاد
RewriteRule ^([^/.]+)(\/)?$ z.p.php?user=$1
نتیجه شد :
http://localhost/admin
میشه یه توضیح هم در مورد این rule بدید
RewriteRule ^([^/.]+)/([^/.]+)/followers?$ followers.php?uname=$1&bname=$2&%{QUERY_STRING}
پاسخ: 
به جزء دستور
%{QUERY_STRING}
سایر موارد مشخص هستند، این دستور نیز معرف پارامترهای درخواست شده از سرور است (یعنی تمام عبارتی که بعد از علامت ? در آدرس URL درخواستی وجود دارد)، به طور مثال query string برای آدرس
http://localhost/admin/index.php?token=e8euhd64hdn3&id=33
مقدار زیر است:
token=e8euhd64hdn3&id=33
نویسنده: یحیی
زمان: ۱۱:۱۴:۰۶ - تاریخ: ۱۳۹۳/۰۵/۲۲
میخواستم بدونم نظرتون راجع به این موضوع چیه
جایی خوندم که برای دوباره نویسی آدرس ها ابتدا همه آدرسها به یک فایل php فرستاده بشه و سپس در اون فایل میتوان فایل مورد نظز را فراخوانی کرد
مثلا همه فایل ها به فایل main.php ازسال بشه و سپس در این فایل متعاقب درخواست صفحه مورد نظر فراخوانی بشه
پاسخ: 
این بحث با حالت دوباره نویسی لینک های داینامیک متفاوت است، حالت مد نظر شما در هنگام طراحی ساختار یک برنامه کاربرد دارد که به فرض مطابق با پارامتر دریافتی از لینک یک کلاس یا کد PHP خاص در هسته برنامه پردازش می شود، اما بحث URL Rewrite به هسته برنامه مرتبط نیست و صرفا لینک های سایت را به صورت استاتیک تبدیل می کند.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




5 × 6
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form adel
در:
سلام با تشکر از سایت خوب شما. یه سوال داشتم چگونه تمام این کدها را در جاوا اسکریپت همزمان قرار دهیم. من مثلا دستور این...
۲۱:۲۵:۴۰ ۱۳۹۸/۰۸/۲۴

form یه سوال کننده
در:
سلام. ببخشید چطور میشه ایمیل هایی رو میفرستن که ریپلای زدن رو ایمیلی که از طرف ما نبوده بیشتر تو تبلیغات دیدم امیدوارم منظورم و...
۰۳:۲۳:۰۸ ۱۳۹۸/۰۸/۲۴

form پرتو
در:
با عرض سلام و خسته نباشید امیدوارم حالتون خوب باشه من دو سه سال پیش وبلاگم رو حذف کردم ایا امکانش هست برگرده؟ ادرس...
۱۴:۵۵:۵۲ ۱۳۹۸/۰۸/۲۰

form علی
در:
سلام من نمی تونم html tag رو چطور در وبلاگم قرار بدم وبلاگم اینه
tagtak.blog.ir
۱۰:۲۳:۳۴ ۱۳۹۸/۰۸/۲۰

form حمید
در:
سلام. خسته نباشید. من میخاستم استایل فیلدهای فرمم رو تغییر بدم منتهی نمیدونم از چه کدهایی باید استفاده کنم. برای اینکه فرمی به شکل...
۱۰:۳۶:۱۹ ۱۳۹۸/۰۸/۱۹

form سمیه
در:
سلام ممنون بابت آموزش مفیدتون توی تگ ها هرچیزی که در تگ head قرار بگیره نمایش داده نمیشه، اما ممنون میشم...
۲۰:۴۹:۲۳ ۱۳۹۸/۰۸/۱۷

form استادمجازی
در:
سلام. از ادمین عزیز و همگی دعوت می کنم آموزش های خوبتون را بصورت آموزش ویدیویی یا صوتی و... در سایت ostadmajazi.com استادمجازی ...
۲۲:۱۲:۲۳ ۱۳۹۸/۰۸/۱۳

form mohamad
در:
سلام و خسته نباشید ، توی فرمی که ساختم چند تا drop down دارم که میخوام با php براشون شرط بذارم به طوری...
۱۳:۵۱:۳۴ ۱۳۹۸/۰۸/۱۰

form رضا
در:
خسته نباشید این جلسه آخر html بود؟؟؟؟
۰۱:۱۵:۰۷ ۱۳۹۸/۰۸/۱۰

form امیرمحمد
در:
سلام و خسته نباشید استاد بنده میخوام بین دو کد زیر که مشخص کردم رو به دست بیارم
// ---------------------set سلام...
۱۹:۳۰:۵۳ ۱۳۹۸/۰۸/۰۸

form حجت
در:
خیلی ممنونم از لطف شما. اوکی شد.
۱۰:۲۸:۳۵ ۱۳۹۸/۰۸/۰۶

form میلاد
در:
آشنایی نسبی با css, php و ajax دارم و نمیخام از library های موجود در نت استفاده کنم. خواستم با همین متد که انصافا روان...
۲۳:۲۲:۵۵ ۱۳۹۸/۰۸/۰۵

form عرفان
در:
با سلام. مدتی بود که بدلایل مشکلات زیاد نتونستم به وبلاگم رسیدگی کنم ولی وقتی برگشتم میبینم که هزاران بازدید داشتم و همشونم به زبان...
۲۲:۴۹:۴۴ ۱۳۹۸/۰۸/۰۵

form raha
در:
سلام وقتتون بخیر ببخشید علامت @ در کل به چه معناست ممنون میشم پاسخ دهید
۲۰:۱۲:۵۹ ۱۳۹۸/۰۸/۰۵

form میلاد
در:
باسلام تشکر از مطالب روان و پرکاربردتان. در خصوص آموزش مذکور، نحوه و ترفند نمایش محور عمودی در سمت چپ نمودار (مشابه...
۰۲:۳۸:۴۰ ۱۳۹۸/۰۸/۰۵