آگهی
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 یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: ali
زمان: ۱۶:۳۹:۳۹ - تاریخ: ۱۳۹۳/۰۹/۰۳
سلام
با تشکر از مطلب بسیار خوبتون .
امکانش هست یه راهنمایی کنید . من آدرس زیر رو دارم :
domain.com/page.php?id=24&k=df48f
مشکل عدم کش شدن صفحات هست چون ادرس به صورت کوئری هست. به همین علت میخوام ؟ رو حذف کنم اما یه مشکل دیگه در عبارت آخر یعنی df48f هست که یه کد رندم هست و برای هر بار لود شدن تغییر میکنه .
حالا چطور میتونم اونو به آدرسی ریرایت کنم که عبارت df48f حذف بشه . و کوئری استریگ نباشه
به عبارتی چطور df48f رو توی تغریف ریرایت بزارم .
پاسخ: 
سلام
اگر به مثال های ذکر شده در آموزش دقت کنید، پارامتر زیر می تواند شامل هر کاراکتری به جزء / شود:
([^/]+)
به نظر این حالت می تواند در مورد هدف شما نیز مصداق داشته باشد.
نویسنده: حمید
زمان: ۲۰:۳۷:۱۳ - تاریخ: ۱۳۹۳/۰۹/۲۵
سلام و خسته نباشید
من دو تا لینک دارم دوباره نویسی کردم ولی وقتی اجرا میکنم کوئری استرینگ ها رو میشناسه ولی فایل های css , js , ... رو نمیشناسه
حتی اون سفحه رو من ذخیره کردم تمام فایل ها رو با پسوند .htm ذخیره کرد
ایراد از چیه
RewriteRule ^product/([0-9]+) /?page=showproduct&productID=$1 [NC,L]     
RewriteRule ^category/([0-9]+)/([0-9]+) /?page=category&cate_id=$1&com_id=$2 [NC,L]
پاسخ: 
سلام
هرچند حل مشکل نیاز به آشنایی قبلی با سیستم سایت و تست آنلاین است، اما به نظر با تغییر آدرس دهی فایل های CSS و JS به صورت مطلق (یعنی با آدرس کامل سایت در ابتدای دایرکتوری فایل در قسمت href) این مشکل رفع خواهد شد!
نویسنده: حمید
زمان: ۲۳:۲۲:۴۸ - تاریخ: ۱۳۹۳/۰۹/۲۵
سلام و خیلی خیلی ممنون از پاسخ سریع تون
و همون طور که گفتید مشکل به این صورت حل میشه ولی این راه رو دوست ندارم چون کلی باید تو سایت تغییرات بدم
ایا برای این کار میشه از htccess بهره گرفت و ادرس اصلی سایت رو داد
ممنون میدونم که سرتون شلوغه و قدردانی میکنم از محبتتون
پاسخ: 
سلام
یک راه حل دیگر برای رفع مشکل آدرس های نسبی (relative url) در لینک های دوباره نویسی شده وجود دارد:
علامت / را در ابتدای قسمت href اضافه کنید، مثال:
<link rel="stylesheet" type="text/css" href="/dir/style.css">
به نظر با htaccess نمی توان برای این مشکل راه حلی ارائه کرد، چون با استاتیک شدن لینک ها و نسبی بودن آدرس ها، مرورگر اطلاعات را از دایرکتوری فعلی بارگذاری می کند، مگر اینکه علامت / را درج کنید.
نویسنده: علی
زمان: ۱۶:۰۰:۴۱ - تاریخ: ۱۳۹۳/۱۰/۰۳
سلام
میخواستم بدانم وردپرس یا دیگر سایت ها چگونه پست را تشخیص میدند هنگامی که کد یا آی دی مطلب در نوار آدرس وجود نداره فقط عنوان مطلب است
مثلا به جای آدرس زیر
http://domain/100/title
فقط عنوان مطلب باشد
http://domain/title
در آدرس اولی عدد 100 کد مطلب است آن را میگیرم و از دیتابیس اطلاعاتش را میخونیم ولی برای آدرس دومی باید چه جوری به اطلاعات آن در دیتایس دست پیدا کنیم یعنی کد مطلب را به دست بیاریم
با تشکر
پاسخ: 
سلام
برای این کار معمولا یک لینک یکتا برای هر مطلب در دیتابیس ذخیره می کنند، این لینک یکتا می تواند به صورت خودکار یا توسط کاربر ایجاد شود، زمانی که آدرس یک صفحه فراخوانی می شود، پارامترها را با دیتابیس تطبیق داده و مطلب مورد نظر شناسایی می شود، البته این کار در مقایسه با حالت ID معایب و مزایایی دارد، عیب آن این است که اگر لینک یکتا پس از انتشار در وب چندین بار تغییر کند، ممکن است ریدایرکت به لینک اصلی مشکل ساز شود، مزیت آن این است که لینک ها کوتاه تر و ساختار دیتابیس مخفی تر خواهد بود (البته روش ID در مجموع بیشتر مورد استفاده قرار می گیرد).
نویسنده: یوسف
زمان: ۰۳:۴۲:۱۵ - تاریخ: ۱۳۹۳/۱۰/۰۴
سلام، واقعا کارت جای تشکر داره
خیلی وقت بود دنبال یه آموزش واسه عبارات با قاعده میگشتم. دمت گرم موفق باشی
نویسنده: habd
زمان: ۲۰:۱۲:۱۷ - تاریخ: ۱۳۹۳/۱۱/۰۵
سلام مرسی به خاطر زحمت و مطالب خوبتون
من از کد زیر برای تغییر آدرس استفاده کردم :
RewriteRule ^report/([a-z]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.) index.php?option=com_k2&view=$1&cat=$2&id=$3&Itemid=$4&$5 [nc]
و هیچ مشکلی هم نیست و لینکها به درستی اجرا میشه
ولی تو webmaster google همیشه 200 تا 300 عدد اررور دارم که لینکهامو به هم میچسبونه همینجوری الکی و نمیدونم مشکل از کجاس
مثلاً مدل لینک هایی که خزنده گوگل پیدا کرده و نمیتونه بازشون کنه اینجوریه :
لینک صحیح :
http://test.domain.ir/report/item/3/12/34343/title-be-soorate-farsi.html
آدرسی که گوگل ایجاد میکنه :
http://test.domain.ir/report/item/3/12/news/item/43/43243/news/item/32/43243
و نمیدونم واقعاً مشکل از کجاس منون میشم راهنمایی کنید
پاسخ: 
سلام
ظاهرا ربات گوگل کمی بیش از حد کنجکاو تعریف شده و حالت های مختلفی که عملا در صفحات سایت وجود ندارند را نیز با حذف پارامترها از لینک ها امتحان می کند، به هر صورت برای مدیریت صحیح این گونه موارد بهترین راه استفاده از ریدایرکت 301 و انتقال همیشگی به لینک صحیح (و یا خطای 404) است، این کار هم می تواند در دستورات htaccess و هم کدهای PHP صورت گیرد، منتها باید دقت کافی و تست های لازم انجام شود.
نویسنده: habd
زمان: ۲۰:۱۵:۴۷ - تاریخ: ۱۳۹۳/۱۱/۰۵
یه سوال دیگه اینکه عنوان خبر رو در آدرس نمایش میدم اما اگر علامت % داخل عنوان باشه سایت اررور میده
400 Bad Request
مرسی
پاسخ: 
بر اساس استاندارد RFC 3986 علامت % در URL باید با دو عدد پس از آن بیاید تا نماینگر کاراکتر خاصی باشد، به عبارت بهتر لینک های شما باید به درستی و بر اساس استاندارد آدرس های وب اینکد شوند و کاراکتر % تبدیل به 25% شود:
http://en.wikipedia.org/wiki/Percent-encoding

http://php.net/manual/en/function.rawurlencode.php
نویسنده: habd
زمان: ۲۲:۳۰:۲۹ - تاریخ: ۱۳۹۳/۱۱/۰۵
مرسی از پاسختون
در مورد سوال اول که جواب دادید که آدرس ها رو ریدایرکت کنم باید بگم که گوگل دو تا آدرس جدا رو با شکل های مختلف داره به هم میچسبونه
با htaccess چجوری میشه به صورت صحیح آدرس رو تجزیه کرد و پارامترها رو کشید بیرون و ریدایرکت کنم به آدرس جدید ؟؟
مرسی
پاسخ: 
در صورتی که الگوی خاصی وجود ندارد و ربات به اشتباه لینک ها را ایجاد می کند، بهتر است پیام 404 تنظیم کنید (از طریق دستورات header کد HTTP 404 را به ربات ارسال کنید)، چون دایرکتوری مورد نظر عملا وجود خارجی ندارد و حتی زیرمجموعه هیچ لینک دیگری نیز نیست.
نویسنده: ha
زمان: ۲۲:۳۲:۲۱ - تاریخ: ۱۳۹۳/۱۱/۰۵
در مورد سوال دوم هم که در مورد % در آدرس سایت بود ، آیا میشه با htaccess % رو به 25% تبدیل کرد ؟؟
پاسخ: 
این کار باید قبل از ایجاد و انتشار لینک انجام شود، دستورات htaccess در اینجا موثر نیستند، چون با فراخوانی لینک معیوب، سرور قبل از پردازش فایل htaccess خطای Bad Request را ارسال می کند (مگر اینکه بتوانید ماژول های امنیتی سرور را دستکاری کنید که توصیه نمی شود)، لینک های فعلی را اصلاح کنید، لینک هایی که قبلا ایندکس شده اند را به حال خود رها کنید (تا پس از مدتی از ایندکس حذف شوند)!
نویسنده: hamed
زمان: ۱۴:۵۸:۵۰ - تاریخ: ۱۳۹۳/۱۱/۰۶
سلام
من میخوام آدرس یک صفحه ای مثله زیر رو تغییر بدم
www.my.com/index.php?option=com_hamed&Itemid=100&task=test
تغییر بدم به:
www.my.com/component/test
و آدرس قبلی هم ریدایرکت کنم به آدرس جدید
ولی وقتی کداشو میزنم اين اررور رو ميده :
This webpage has a redirect loop
اینم کدام :
RewriteRule ^component/(.+) index.php?option=com_hamed&Itemid=100&task=$1&mode=All [NC,L,R=301]
#RewriteCond %{QUERY_STRING} option=com_hamed&Itemid=100&task=([a-zA-Z]+)&mode=All$ [NC]
RewriteRule ^index.php /component/%1? [NC,L,R=301]
پاسخ: 
سلام
هرچند بدون تست نمی توان پاسخ دقیق داد، اما روش زیر را امتحان کنید:
به جای پارامتر QUERY_STRING از
%{THE_REQUEST}
استفاده کنید:
#RewriteCond %{THE_REQUEST}  /index.php\?option=com_hamed&Itemid=100&task=([a-zA-Z]+)&mode=All$   [NC]
نکته: دقت کنید که تغییرات دقیقا مطابق نمونه بالا باشد.
نویسنده: هستی
زمان: ۰۰:۲۶:۵۸ - تاریخ: ۱۳۹۳/۱۱/۲۴
سلام
اگه بخوام آدرس زیر رو:
example.com/folder/test.php?name=hasti
به:
example.com/folder/hasti
تبدیل کنم باید چیکار کنم؟ هر کاری میکنم نمیشه...
پاسخ: 
سلام
در حالت معمول روش زیر کاربرد دارد.
RewriteEngine On
RewriteRule ^folder/([^/]+) /folder/test.php?name=$1 [NC,L]
منتها این دستور نباید با ساختار سایر لینک های سایت شما مشابه باشد، در غیر این صورت ممکن است باعث ایجاد اختلال گردد!
نویسنده: رضا
زمان: ۱۰:۳۵:۲۳ - تاریخ: ۱۳۹۳/۱۲/۰۲
وقت بخیر من میخوام ادرس های که تو مرورگر وارد میشه از
site.com/post.php?id=5
تبدیل بشه به
site.com/title.html
میتونید راهنمایی بکنید؟ صرفا باید از htaccess استفاده کنم؟ یا موارد دیگه چون دقیقا هم نمیدونم چی جستجو کنم مزاحم شدم
پاسخ: 
بله، باید از htaccess و دستور Rewrite استفاده کنید که نمونه ها در آموزش حاضر تا حد امکان به طور کامل توضیح داده شده.
نویسنده: احسان
زمان: ۲۳:۳۱:۱۰ - تاریخ: ۱۳۹۳/۱۲/۱۶
سلام وقت بخیر من میخوام این آدرس را
http://localhost/t7/index.php?page=1
به این آدرس تغییر بدهم ولی هر کاری میکنم نمی شود چیکار کنم
page/1
و در واقع این شمارنده ، شماره صفحه بندی هست و هی تغییر می کند نمونه کد استفاده شده
RewriteEngine On
RewriteRule ([^/]+)/page/1 /index.php?page=1 [NC,L]
ایا کدم اشتباه است
و میخواهم که این ادرس با شماره صفحه تغییر کند
پاسخ: 
سلام
اگر الگوی فعلی آدرس ها به شکل حالت اول باشد، تغییر آنها باید به صورت زیر تنظیم شود:
RewriteRule ([^/]+)/index.php?page=([0-9]+) /index.php?page=$2 [NC,L]
همچنین باید دقت کنید که این دوباره نویسی با سایر حالت های موجود در سایت تداخل نداشته باشد.
نویسنده: احسان
زمان: ۰۱:۱۵:۰۵ - تاریخ: ۱۳۹۳/۱۲/۲۰
سلام این کد رو امتحان کردم ولی جواب نداد
RewriteRule ([^/]+)/index.php?page=([0-9]+) /index.php?page=$2 [NC,L]
بازم این آدرس رو میده
index.php?page=1
ولی من میخوام که به این آدرس تبدیل بشه
page/1
ولی نمیشه چیکار کنم؟ ببخشید انقد مزاحم میشم
پاسخ: 
سلام
سوالتان مبهم است! مشخص نیست منظور از تبدیل به آدرس ریدایرکت است یا دوباره نویسی لینک؟! اگر منظور دوباره نویسی است باید با نمونه کد درج شده عملی باشد، در هر صورت بدون دیدن یک نمونه آدرس از سایت شما و ارائه توضیحات کامل، متاسفانه امکان راهنمایی بیشتر وجود ندارد.
نویسنده: علیرضا
زمان: ۰۷:۱۲:۱۸ - تاریخ: ۱۳۹۳/۱۲/۲۵
سلام
من میخوام آدرس:
example.com/user/?name=foo
به:
example.com/user/foo
تبدیل شه، که user یه فولدره اینو نوشتم ولی جواب نمیده:
RewriteRule ^user/([^/]+) /user/?name=$1 [NC,L]
پاسخ: 
سلام
مشکلی در دستور نوشته شده نیست، باید ایراد در قسمت دیگری باشد که نیاز به بررسی و تست دارد!
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ کوتاه و مختصر داده خواهد شد!
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.





4 × 2
 refresh
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form سحر
در:
سلام من وقتی میخوام توی قسمت صفحات جداگانه وبلاگم گزینه ادامه مطلب رو بیارم باید چیکار کنم چون فقط قسمت نوشته جدید همچین قابلیتی...
۱۵:۰۸:۱۹ ۱۳۹۹/۰۳/۰۸

form علی
در:
با سلام و درود فراوان یه کد جاوا دارم می خوام هر ثانیه نام یه فایل یا پوشه ای رو بگیرم برای مقایسه تا...
۱۱:۰۶:۲۲ ۱۳۹۹/۰۳/۰۸

form علیرضا
در:
با سلام مجدد در پاسخ یکی از کامنت هایم فرمودین که جهت فراخوانی (اجرای) یک فایل در سرور راس ساعت مشخص و صرف...
۱۱:۲۸:۲۴ ۱۳۹۹/۰۳/۰۵

form علیرضا
در:
سلام اگر بخواهیم صفحات سایت رأس ساعت مشخصی مثلا ساعت 12 ظهر رفرش بشه چه کدی رو باید استفاده کنیم. ممنون
۰۴:۴۳:۴۷ ۱۳۹۹/۰۳/۰۵

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

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

form علی
در:
چطور میشه همزمان با کلیک بر روی «تعویض کد» یعنی کد زیر: پوشه ساخته بشه. با سپاس
۰۹:۵۰:۲۷ ۱۳۹۹/۰۳/۰۳

form علی
در:
با سلام... من یه متغیر تعریف کردم مثلا رو بهش متصل کنیم ممنون از پاسختون.
۰۶:۱۶:۲۷ ۱۳۹۹/۰۳/۰۳

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

form مرتضی ق
در:
سلام خسته نباشید. یک سایت اصلی و مادر دارم مثلا www.m.com حالا سه سایت دیگر زیر مجموعه مثلا m1 و m2 و m3 من...
۱۸:۲۵:۱۱ ۱۳۹۹/۰۳/۰۲

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

form fatemeh
در:
پاراگراف زیر را داریم. چه تنظیماتی در CSS و HTML نیاز است تا در صفحه وببدرستی نمایش داده شود؟ میشه برا جواب این سوال...
۱۶:۳۲:۲۳ ۱۳۹۹/۰۳/۰۱

form علی
در:
با سلام و عرض ادب من یه فانکشن تعریف کردم و کدهای فایل ajax-loading-message.php رو درونش گذاشتم
۰۸:۴۲:۲۱ ۱۳۹۹/۰۳/۰۱

form Maryam
در:
سلام .. من میخاستم کدی بنویسم که خروجی آن دکمه on .. of باشه که با زدن دکمه رنگ پس زمینه تغییر کند ممنون میشم...
۰۲:۲۱:۳۴ ۱۳۹۹/۰۲/۳۱

form amir
در:
سلام ممنون از سایت خوبتون چطور میشه با جاوااسکریپت ایجکس و پی اچ پی بتونم تمامی جدول های دیتابیس رو هر کدوم با یه...
۲۰:۴۵:۵۲ ۱۳۹۹/۰۲/۳۰
form علی
در:
با سلام و عرض ادب بسیار سایت پر محتوایی دارید تبریک... می خواستم بپرسم اگر بخواهیم مثلا کاربر روی یک لینکی در سایت...
۰۷:۲۲:۰۱ ۱۳۹۹/۰۲/۳۰
form Edward ASharp
در:
سلام میشه همين فایلای کاملشو به من بدید؟
۰۰:۰۲:۲۱ ۱۳۹۹/۰۲/۳۰
form میکاییل
در:
سلام من پروزه ای دارم با mvc نوشته شده و در روت سایت فایل htacsess دارم که کد های زیر توشه ...
۰۲:۳۰:۰۲ ۱۳۹۹/۰۲/۲۹
form mahdi
در:
سلام استاد عزیز ، این درسته که با node.js دیگه نیازی به یادگیری php نخواهیم داشت؟
۲۲:۳۹:۳۶ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام ممنونم از اینکه کمکم کردید ولی من منو رو با زیر منوها می خواستم کد شما زیر منوها رو از بین برد. منظور من...
۲۲:۳۰:۱۵ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام. من در طراحی منو سایت با مشکل برخوردم. من منو خودم رو ساختم و متوجه شدم که منو من مقداری فضا از سمت چپ...
۱۹:۲۴:۰۱ ۱۳۹۹/۰۲/۲۸
form امین
در:
خیلی خیلی ممنون از اینکه جواب دادید اما الان که امتحان کردم مجموع همه ی سفارشات رو میزنه یعنی اگر 3 نفر سفارش دادن...
۱۳:۴۶:۵۵ ۱۳۹۹/۰۲/۲۸
form امین
در:
درود به شما خسته نباشید یک سوال داشتم خیلی گشتم اما پیدا نکردم من دیتابیسی برای مثال invert دارم میخوام یک صفحه...
۰۱:۰۰:۴۵ ۱۳۹۹/۰۲/۲۸
form امیر
در:
عالی بود. سپاس گذارم
۱۰:۱۹:۴۴ ۱۳۹۹/۰۲/۲۷
form فرامرز اسماعیلی
در:
سلام خسته نباشید. من داخل ویرایشگرهای notepad++ یا Braket دستور html رو می نویسم یعنی فایل متنی به صورت index.html رو می خواهم اجرا کنم...
۲۲:۴۱:۴۳ ۱۳۹۹/۰۲/۲۶
form پری
در:
سلام بعضی از سایت ها وقتی اهنگ بعدی رو پلی میگنیم اهنگ قبلی که در حال پخش است به طور خودگار قطع میشود میشه این...
۱۴:۲۲:۲۵ ۱۳۹۹/۰۲/۲۶
form ilia Delbar
در:
خیلییییییییییی خوبه! فقط دلم می خواد یه برنامه درست کنم رنگ ها رو نشون بده (رنگ تگ ها)
۱۳:۱۵:۱۹ ۱۳۹۹/۰۲/۲۶
form زهیر صفری
در:
با سلام چطور میتونم تاریخ تولد فرد ایرانی رو بگیره مثلا از input و سن فرد رو در input بعدی نمایش بده میتونید...
۱۲:۳۸:۵۷ ۱۳۹۹/۰۲/۲۶
form حبیب
در:
با سلام بنده از طریق مودم خانه به اینترنت وصل شدم هم با کامپیوتر و هم با موبایل. اما ای پی در هر...
۰۳:۱۲:۵۴ ۱۳۹۹/۰۲/۲۶
form امین
در:
سلام خسته نباشید امیدوارم جوابمو بدید من داخل یک صفحه این کد جاوا رو دارم میخوام خروجی که میده رو داخل...
۱۳:۴۴:۳۳ ۱۳۹۹/۰۲/۲۵
form امیر هادی نجاتی
در:
ممنون از شما. این قسمت (استفاده از جاوا اسکریپت برای غیر فعال کردن کلیک راست) واقعا به دردم خورد .
۲۱:۰۳:۵۰ ۱۳۹۹/۰۲/۲۴
form لیلا
در:
سلام ، ببخشید من میخوام یک مدرک رو در سایت آپلود کنم ولی ارور زیر رو میده . میشه راهنماییم کنید. ممنون
۱۴:۵۲:۴۷ ۱۳۹۹/۰۲/۲۴
form زهرا جعفری
در:
با سلام بنده میخواهم در جاوااسکریپت یک textbox داشته باشم که در آن یک دکمه چشمک زن بذارم وسط متن و وقتی روی...
۱۰:۰۱:۵۱ ۱۳۹۹/۰۲/۲۴
form جواد
در:
سلام. مقادیر و اطلاعاتی از یک سایت دیگه با همین متد file get contents میگیرم که روی لوکال هاست سرعتش خوبه، روی سرور هم بد...
۲۲:۰۳:۲۲ ۱۳۹۹/۰۲/۲۳
form علی رضایی
در:
در خط آخر خطای نحوه ارسال آرگومان می دهد. خطای syntax است یا دستور مورد دارد؟
۱۳:۲۹:۴۹ ۱۳۹۹/۰۲/۲۳
form علی
در:
سلام میخوام مطالب مرتبط با موضوعات سایتم رو در پایین اونها نمایش بدم چجوری میتونم این کار رو بکنم
۰۱:۲۸:۰۰ ۱۳۹۹/۰۲/۲۳
form امیرحسین
در:
با سلام. من تو css میخوام از اتریبیوت border-radius استفاده کنم ولی وقتی مقدارشو مثلا توی div زیاد میذارم متن داخل div بیرون میاد میخواستم...
۱۹:۵۲:۳۰ ۱۳۹۹/۰۲/۲۲
form امیرعلی
در:
با سلام بنده میخواستم بدانم که میشود تگ div را با این روش ها پنهان کرد من میخواهم افزونه ی وردپرسی را...
۱۲:۳۹:۲۶ ۱۳۹۹/۰۲/۲۲
form یوسف رضایی
در:
با سلام و خسته نباشید خواستم بپرسم خروجی یک فرم (با چند گزینه) بر روی برووزر که اماده برای ارسال برای سرور هست را توی...
۱۱:۱۴:۰۳ ۱۳۹۹/۰۲/۲۲
form سعیده
در:
سلام من یه اهنگ که تو وبلاگم میزارم صفحه پخش اهنگ میاد و بلندگوش ولی اون مثلث پلی کنندش نمیاد یعنی عملا واسم...
۱۵:۴۱:۰۵ ۱۳۹۹/۰۲/۲۱
form مجید اسکندری فر
در:
سلام حدود 700 تصویر رو در وبلاگم بارگذاری کردم و حدود 6000 بازدید داشته علت عدم نمایش تصاویر بارگذاری شده در وبلاگم چیست؟ خیلی زحمت...
۱۰:۳۲:۴۵ ۱۳۹۹/۰۲/۲۱
form علیرضا
در:
سلام، ممنون از مطلب کاملتون یه نکته رو هم من اضافه کنم برای کاملتر شدن مقاله، هر آدرس آی پی از یک شناسه هاست...
۰۹:۳۷:۵۰ ۱۳۹۹/۰۲/۲۱
form mahdi
در:
سلام استاد عزیز ، خیلی ممنون از راهنمایی ، انجامشون میدم، فکر میکنم همه این کارارو بلد باشم فقط WYSIWYG رو اصلا نشنیده بودم که...
۰۷:۱۸:۳۷ ۱۳۹۹/۰۲/۲۱
form معصومه
در:
سلام، امروز دیدم که عکس های وبلاگم حذف شده چرا؟ چطور میتونم برشون گردونم؟ عکس ها رو از سایت پیکو فایل آپلود میکردم، هرچقدرم سعی...
۱۴:۵۳:۵۱ ۱۳۹۹/۰۲/۲۰
form mahdi
در:
سلام استاد عزیز و گرامی ، یه درخواستی داشتم ازتون میخوام اگه براتون ممکنه من رو در جاوا اسکریپت بسنجی که بدونم چیا بلدم...
۱۴:۱۸:۵۸ ۱۳۹۹/۰۲/۱۹
form امیر
در:
با سلام، خدمت دوستان عزیز دو جدول به نام‌های Messages و Comments موجود هستند. در جدول Comments فیلدی به نام IDElement وجود دارد که...
۰۵:۲۹:۳۸ ۱۳۹۹/۰۲/۱۹
form ehsan hoseini sianaki
در:
سلام خیلی عالی و کاربردی بود. خسته نباشید.
۲۳:۰۰:۵۱ ۱۳۹۹/۰۲/۱۷
form امید
در:
با سلام و عرض ادب فیلتری میخوام که تعداد جوابهای فیلترهای سایت tse بورس که با جاوا نوشته شده رو بگه مثلا قرار...
۰۰:۱۰:۵۱ ۱۳۹۹/۰۲/۱۷
form احسان
در:
سلام ببخشید من هر کار میکنم تو گوشی اندروید با Html یه عکس رو در سایت خودم بزارم هیچی نمیشه فقط یه علامت عکس میاد...
۲۲:۲۸:۳۷ ۱۳۹۹/۰۲/۱۶
form hasti
در:
سلام . وقت بخیر . میشه مثالی بزنید که right over join برابر با inner join (داخلی) بشه . /با order و customer/ ...
۲۰:۰۵:۱۷ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام مجدد من دیگه اینقدر با این کدها ور رفتم دیوونه شدم. این کل تابع منه. شما می تونید برای حل مشکلی که...
۱۷:۳۰:۳۱ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام در تکمیل سوالی که خدمت شما عرض شد: ببینید ما دو تا فیلد فایل داریم توی اولی عکس اپ میشه و توی...
۱۶:۲۶:۲۶ ۱۳۹۹/۰۲/۱۶
form ماردین
در:
سلام من میخواستم ببینم چکار کنم که اولین query رو بدون حذف بقیه query ها حذف کنم
۱۵:۵۲:۵۴ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام یه سوال خدمت شما داشتم. من با جاوا اسکریپت میخوام بخش فایل توی فرمم رو چک کنم. توی فرم 2 تا فیلد...
۱۱:۴۷:۵۲ ۱۳۹۹/۰۲/۱۶
form amir mtf
در:
سلام ببخشید من میخواستم در تگ این‌پوت برخی از کلمات و علامت ها رو حذف کنم. یک درخواست دیگر هم دارم اگه میشه کد...
۱۲:۳۷:۰۵ ۱۳۹۹/۰۲/۱۵
form کیوان
در:
سلام ممنون از سایت خوبتون، من یه فرم دارم که اطلاعاتش رو از دیتابیس میگیره، چطور میتونم با نوشتن حلقه بعد از چاپ سه...
۱۸:۲۲:۲۴ ۱۳۹۹/۰۲/۱۳
form mohammad
در:
آموزشتون خیلی فهما و دقیق بود ممنون
۲۱:۵۵:۳۸ ۱۳۹۹/۰۲/۱۲
form محمودی
در:
سلام چطوری میتونم برای سایت ثبت نام کدبورسی و ثبت نام ارز دیجیتال بک لینک بگیرم
۱۵:۲۶:۰۷ ۱۳۹۹/۰۲/۱۲
در انتظار بررسی: ۰