دسته بندی
×
آگهی
article

دوباره نویسی آدرس های اینترنتی (URL Rewrite) در htaccess

web-url-rewrite

دوباره نویسی آدرس های اینترنتی یا URL Rewrite تکنیکی است که در دانش سئو (علم بهینه سازی برای موتورهای جستجو یا Search Engine Optimization) توصیه شده و امروزه در گستره وب مورد استفاده قرار می گیرد، اغلب آدرس های اینترنتی به دلیل اینکه به صورت داینامیک ایجاد و به ردیف های پایگاه داده اشاره دارند پارامترها و مقادیر مربوط به ساختار برنامه نویسی و پرس و جوها را در خود نمایش می دهند، به طور مثال در بیشتر سیستم های مدیریت محتوایی که به زبان PHP یا ASP.NET نوشته می شوند برای تنظیم پارامترهای آدرس های URL باید از علامت ?، = و & استفاده شود که این حالت ضمن اینکه ساختار برنامه نویسی سایت را در معرض دید عموم قرار می دهد از نظر سئو و موتورهای جستجو نیز بهینه نیست، البته اینکه واقعا آدرس های داینامیک در مقابل آدرس های استاتیک (URL هایی که پارامتر متغیر ندارند و همواره ثابت هستند) تا چه میزان روی عملکرد صفحات وب از نظر سئو تاثیر گذار است خود جای بحث دارد، اما به دلایل دیگر شاید هنوز ضرورت استفاده از آدرس های استاتیک برای داشتن صفحات وب بهینه همچنان احساس شود، به هر صورت به جهت کاربردی بودن این تکنیک مطلب پیش رو را به آموزش نحوه دوباره نویسی آدرس های اینترنتی (URL Rewrite) در فایل htaccess اختصاص داده ایم.

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


ممکن است این سوال در ذهن خیلی از برنامه نویسان و مدیران سایت های وب وجود داشته باشد که آیا حتما باید از آدرس های URL استاتیک استفاده کنیم؟
پاسخ به این پرسش بستگی زیادی به هدف و میزان تسلط و آشنایی ما با برنامه مدیریت محتوایی دارد که از آن برای سایت خود استفاده می کنیم (برنامه های مدیریت محتوا تحت عنوان CMS یا Content Management System شناخته می شوند)، دلایلی برای استفاده از آدرس های استاتیک ارائه می شود از جمله اینکه:
- حفظ امنیت و مخفی سازی ساختار برنامه نویسی
- کوتاهتر بودن URL و سهولت به حافظه سپاری
- کسب رتبه بهتر در موتورهای جستجو و کلیک بیشتر
به لحاظ حفظ امنیت و مخفی سازی ساختار برنامه نویسی CMS ها این گونه آدرس ها از ضریب اطمینان بالاتری برخوردارند، چرا که URL های داینامیک معمولا ساختار مشخص و در معرض دیدی دارند که نحوه قرارگیری دایرکتوری ها و عناوین واقعی ستون های دیتابیس را نمایان می کند اما با دوباره نویسی آدرس ها ساختار URL ها به نحو دلخواه پیچیده و نامفهوم می شود، مثال:
example.com/index.php?id=1&title=url-rewrite

example.com/1/url-rewrite
در این مثال پسوند php به راحتی زبان برنامه نویسی سایت را مشخص می کند و پارامترهای id و title احتمالا اشاره مستقیم به نام ستون های پایگاه داده دارند که در کل به لحاظ امنیت توصیه نمی شود، هرچند وجود پارامترها یا مشخص بودن زبان برنامه نویسی سایت به خودی خود مشکلی ایجاد نمی کند و به صرف این حالت امکان نفوذ به برنامه ما وجود ندارد اما در مقوله امنیت اصل کلی این است که کمترین اطلاعات از تکنولوژی به کار رفته نمایان باشد و پیچیده ترین ساختار را داشته باشیم.
دلیل دیگر توصیه به استفاده از این شیوه کوتاه و خواناتر شدن آدرس های URL و حذف علامت های ?، = و & از آن است، آدرس های استاتیک معمولا کوتاهترند و این در سئو یک مزیت محسوب می شود، البته این گفته بستگی زیادی به تعداد کاراکتر استفاده شده در آدرس URL دارد (هر چه کوتاهتر، بهتر)، آدرس های کوتاهتر و فاقد علامت های داینامیک با سهولت بیشتری به خاطر سپرده می شوند.
مزیت بعدی که در خصوص آدرس های بازنویسی شده گفته می شوند اینکه در لیست نتایج موتورهای جستجو معمولا آمار کلیک بهتری کسب می کنند و به اصطلاح کلیک خور بهتری دارند، دلیل این موضوع هم علاقه گوگل به این سبک آدرس ها و خواناتر بودن آنها به دلیل کوتاهی و وجود عبارات کلیدی در آدرس URL است، البته باید توجه کرد بین یک آدرس داینامیک با پارامترهای مناسب و کوتاه و آدرس استاتیک با شرایط مشابه از نظر کسب کلیک بیشتر شاید آنچنان فرق محسوسی ملموس نباشد.

تصورات اشتباه در خصوص آدرس های وب


هرچند دانش سئو بر ضرورت استفاده از آدرس های دوباره نویسی شده در وب تاکید دارد اما تصورات اشتباهی نیز در این خصوص شکل گرفته است، بعضا گفته می شود که موتورهای جستجو قادر به ایندکس صفحات ارجاعی از آدرس های داینامیک نیستند که این تصور کاملا اشتباه است، تمام موتورهای جستجوی معروف به خوبی آدرس های داینامیک را درک و محتوای آنها را ایندکس می کنند منتها URL های استاتیک به دلایلی که در بالا اشاره شد توصیه می شوند، تصور اشتباه دیگر اینکه می گویند آدرس بازنویسی شده نمی تواند هیچ پارامتر داینامیکی داشته باشد که این گفته نیز کاملا اشتباه است، هدف از دوباره نویسی می تواند بسته به نیاز متفاوت باشد، به فرض ممکن است به لحاظ فنی امکان حذف تمام یا بخشی از پارامترهای داینامیک وجود نداشته باشد (به فرض در موتورهای جستجو شاهد هستیم که این پارامترها همچنان در آدرس URL وجود دارند) و صرفا زبان برنامه نویسی سایت را مخفی می کنند، مثال:
example.com/index.php?id=1&title=url-rewrite

example.com/?id=1&title=url-rewrite
در این مثال صرفا قسمت index.php حذف شده است و به خودی خود اشکالی ایجاد نمی کند (هرچند در سئو هر چه آدرس URL پارامتر داینامیک کمتری داشته باشد بهتر است).

کدام شکل URL را انتخاب کنیم؟


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

نکات مهم دوباره نویسی آدرس های اینترنتی (URL Rewrite)


باید یادآور شویم دوباره نویسی آدرس های داینامیک وب (URL Rewrite) کار حساسی است و باید با دقت و تسلط کامل انجام شود، اشتباه در این مورد ممکن است باعث بروز مشکلاتی از جمله ایجاد محتوای تکراری (Duplicate Content) و یا اختلال در عملکرد سایت شود، البته در صورت گرفتن پشتیبان از دستورات موجود خوشبختانه تغییرات فایل htaccess به سرعت قابل بازگشت به حالت سابق است چون سرور در هر بار فراخوانی آدرس های URL، کدهای htaccess را مجددا اجرا کرده و برای نشست جاری آخرین دستورات را اعمال می کند اما با این وجود بازنویسی باید با در نظر گرفتن تمام احتمالات و آزمایش های لازم قبلی صورت گیرد تا جایی برای هیچگونه اشتباه ناخواسته باقی نماند، بعضا شاهد هستیم که یک قانون به خودی خود مشکلی ایجاد نکرده اما به جهت تداخل با سایر قوانین در نهایت موجب بروز اشکالاتی در عملکرد سایت یا برنامه های تحت وب شده است، اکثر این موارد در صورت تست و آزمایش و خطای قبلی قابل شناسایی و رفع هستند.

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


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

URL Rewrite در سرورهای ویندوز


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

نحوه دوباره نویسی آدرس های وب


برای دوباره نویسی آدرس های وب قبل از هر چیز به فایل متنی ساده بدون نام و با پسوند htaccess. در ریشه سایتمان (پوشه www یا public_html) نیاز خواهیم داشت، اگر فایل htaccess. به طور پیش فرض در سرور وجود ندارد می توانیم به راحتی آن را در برنامه مدیریت هاست مانند cPanel یا DirectAdmin ایجاد کنیم، با توجه به بی نام بودن این فایل در محیط ویندوز ساخت این آن ممکن است به سادگی ممکن نباشد که با راه حل زیر می توانیم این مشکل را رفع کنیم:
برنامه Notepad را اجرا کرده و در صورت نیاز دستورات مورد نظرمان را درون آن درج می کنیم، سپس از گزینه File قسمت Save As را انتخاب کرده و زبانه Save as type را بر روی All files تنظیم می کنیم، نهایتا در قسمت File name عبارت htaccess. را تایپ و فایل را ذخیره می کنیم (دقت کنیم در هنگام تایپ نام فایل نقطه باید در ابتدا باشد!)، راه حل جایگزین اجرای برنامه Command Prompt ویندوز و درج دستور زیر در آن است:
copy con .htaccess
سپس دو بار دکمه Enter را بزنید، فایل در آدرس مورد نظر (معمولا دایرکتوری مربوط به User ویندوز) ایجاد می شود.
دقت کنیم که نقل و انتقال این فایل از سیستم عامل به سرور مخصوصا از طریق برنامه های پروتکل FTP باید به صورت ASCII انجام شود نه باینری (BINARY)، سپس مطابق نیازمان دستوراتی که در ادامه بررسی خواهیم کرد را در آن درج و تنظیم می کنیم.
شیوه نگارش (Syntax) کلی دستورات htaccess به شکل زیر است:
RewriteRule Pattern Target/Substitution [Flags] 
فرض کنیم آدرس زیر را می خواهیم دوباره نویسی کنیم:
http://example.com/index.php?q=home
هدف ما این است که آدرس بالا را به صورت زیر بازنویسی کنیم، یعنی با وارد کردن آدرس زیر در مرورگر سرور پارامترهای URL بالا را در پس زمینه دریافت کند:
http://example.com/home
بدین منظور ابتدا ماژول mod_rewrite را روشن می کنیم، سپس از قوانین آن استفاده کرده و با عبارات با قاعده (در ادامه در این خصوص بیشتر خواهیم گفت) یک قانون (Rewrite Rule) می نویسیم تا وقتی سرور آدرس درخواستی را با آن مطابقت داد قانون ما عمل کرده و پارامترهای اصلی در پس زمینه دریافت شوند:
RewriteEngine On
RewriteRule ^home /index.php?q=home [NC,L]
با کپی عبارت بالا در فایل htaccess. و قرار دادن آن در ریشه سایت، سرور آدرس دریافتی را با قسمت Pattern بررسی و اگر با الگوی قانون تعریف شده مطابقت داشته باشد آدرس اصلی (قسمت Target/Substitution - هدف/جایگزین) را بازنویسی می کند، در واقع آدرس اول URL استفاده شده در سایت است و آدرس دوم URL بازنویسی شده برای استفاده در سرور و برنامه PHP است.
نکته: اگر قوانین را درست و کامل ننویسیم معمولا خطای داخلی سرور با کد 500 یا همان HTTP Error 500 Internal Server Error دریافت خواهیم کرد.
قانون بالا از دو قسمت تشکیل شده است، در بخش اول آدرس درخواست شده از سرور بررسی می شود، اگر این آدرس با الگوی (Pattern) ما که در RewriteRule در نظر گرفته ایم مطابقت داشت، آدرس استاتیک درخواستی به صورت پارامترهای داینامیک قسمت دوم هدف (Target) جانشین (Substitution) می شود، در واقع اگر در قسمت ابتدایی آدرس استاتیک بعد از دامنه سایت عبارت home وجود داشته باشد، سرور آدرس را به صورت index.php?q=home شناسایی می کند، علامت هایی مانند ^ که در قانون نویسی به کار می روند معنی خاصی دارند که به آنها دستورات عبارات با قاعده یا Regular Expressions گفته می شود، حروف [NC,L] نیز معنی خاصی در زمینه نحوه پردازش قوانین دارند و با این روش منظورمان را به سرور تفهیم می کنیم، به طور مثال NC (nocase) به معنی Not Case-sensitive یا حساس نبودن به حروف بزرگ و کوچک است، یا حرف L به معنی Last و آخرین دستور است، یعنی اگر این قانون اجرا شد بقیه قوانین بعد از آن نادیده گرفته می شوند، به این حروف نشانه گذاری در اصطلاح پرچم ها یا Flags می گویند، در ادامه دستورات باقاعده (Regular Expressions) و پرچم ها (Flags) در htaccess را بررسی می کنیم.

عبارات با قاعده (Regular Expressions) در htaccess


برای نوشتن و کاربرد صحیح قوانین دوباره نویسی باید حداقل آشنایی مختصری با عبارات با قاعده (Regular Expressions) داشته باشیم، عبارات باقاعده زبانی قراردادی جهت انتخاب یا بررسی قسمت خاصی از یک رشته متنی است، به طور مثال اگر در رشته متنی زیر که یک آدرس URL فرضی است:
http://example.com/find/?search=htaccess&page=23
بخواهیم صرفا اعداد را استخراج کنیم عبارت باقاعده آن می تواند به این شکل نوشته شود:
([0-9]+)
اگر در همین رشته بخواهیم مقادیر پارامتر search را از URL استخراج کنیم عبارت باقاعده آن به شکل زیر خواهد بود:
^search=([^&]*)
هر کاراکتر در RegExp معنی و کاربرد خاص خود را دارد که آموزش مفصل آن در آدرس زیر در دسترس است:
آموزش کاربردی عبارات با قاعده (Regular Expressions)
در ادامه صرفا جهت یادآوری چند نوع کاراکتر دستوری متداول از عبارت باقاعده را همراه با معنی آنها بررسی می کنیم:
Anchors یا لنگرها:
لنگرها شروع و پایان یک رشته را در الگو مشخص می کنند، به فرض الگوی زیر به معنی کلیه آدرس هایی است که بعد از دامنه سایت قسمت دوم آنها با اعداد (0 تا 9) شروع می شود:
^([0-9]+)$
الگوی بالا با URL فرضی زیر تطبیق دارد:
http://www.example.com/143231
علامت ^ ابتدای دامنه دستور را بعد از آدرس دامنه مشخص می کند و به معنی نقطه شروع الگو است، علامت $ انتهای دامنه دستور را مشخص می کند و به معنی نقطه پایان الگو است، با این توضیح قبل از علامت ^ و بعد از علامت $ نباید کاراکترهای متنی دیگری داشته باشیم در این صورت الگو با متن مطابقت نمی کند، به طور مثال الگوی بالا با URL های فرضی زیر تطبیق ندارد:
http://www.example.com/143231/dir

http://www.example.com/dir/143231
دسته بندی ها یا Character Classes:
نوع دیگر از دستورات باقاعده با حروف الفبای انگلیسی مانند w ،s ،W ،d و... (حساس به بزرگ یا کوچک بودن حروف) تعریف می شوند، به فرض کاراکتر d\ با اعداد (0 تا 9) مطابقت دارد، یا حرف w\ به معنی حروف و اعداد انگلیسی است، همچنین W\ شامل همه چیز به جزء حروف و اعداد انگلیسی می شود، کاراکتر s\ (با حروف کوچک) نیز به معنی فضای خالی و S\ به معنی هرچیزی به جز فضای خالی است.
نکته: برای تفهیم دستوری بودن کاراکترها به سیستم از یک بک اسلش (\) قبل از حروف الفبا استفاده می کنیم، جالب است که در برخی موارد (به طور مثال کاراکتر نقطه) این بک اسلش کاراکتر را از حالت دستوری خارج و به یک حرف متنی ساده تبدیل می کند، نقطه در دستورات عبارات باقاعده به معنی "هر کاراکتر" است اما با درج بک اسلش قبل از آن حالت دستوری خنثی می شود.
تاکیدات یا Assertions:
یک نوع دیگر از کاراکترهای دستوری عبارات با قاعده تاکیدات هستند، به اینصورت که اگر به فرض لینک دریافتی را برای وجود حرف a بررسی کرده و در عین حال بخواهیم بعد از حرف a کلمه فرضی book نیز نیامده باشد، خواهیم نوشت:
[^\S]*a(?!book)[^\S]*
قسمت مربوط به حرف S (با حروف بزرگ) در اینجا به معنی هر چیزی به جزء فاصله خالی در عبارت است، سپس وجود حرف a بررسی می شود و بعد از آن عدم وجود کلمه book و سپس نبودن فضای خالی، اگر آدرس URL درخواستی از این الگو پیروی کند قسمت دوم قانون اجرا می شود.
گروه و حدود:
یکی از پرکاربردترین نوع دستورات در عبارات با قاعده گروه ها و حدود هستند، به فرض اگر بخواهیم قسمت خاصی از یک رشته را انتخاب کنیم می توانیم دستورات را بین کاراکترهای () درج کنیم، مثال:
([\w]+)
این دستور حروف و اعداد انگلیسی را از رشته استخراج می کند، کاراکتر + نشان دهنده الزام به وجود حداقل یک حرف یا عدد است.
نکته: در htaccess می توانیم گروه های داخل () را به صورت شماره گذاری شده دریافت (Capture) کنیم، برای این منظور از کاراکتر $ (علامت دلار یا Dollar Sign) و شماره گروه مورد نظر استفاده می کنیم، مثال:
RewriteRule ([a-z0-9/-]+)-([a-z]+).html$ $1-$2.php [NC,L,QSA]
علاوه بر این اگر بخواهیم بررسی کنیم که در رشته متنی عباراتی بین محدوده اعداد 0 تا 9 یا حروف a تا z قرار دارد یا خیر، خواهیم نوشت:
[^A-Za-z0-9]+
کاراکتر | به معنی "یا":
دستور "یا" با علامت | نیز در عبارات با قاعده کاربرد زیادی دارد، به فرض عبارت زیر به معنی وجود حروف web یا goo در رشته ارسالی است:
(web|goo)
در واقع کاراکترهای دستوری عبارات با قاعده تنوع زیادی دارند و آموزش تمام آنها با جزئیات در این مطلب ممکن نیست، در اینجا بیشتر آشنایی اولیه با شیوه نگارش و هدف از به کارگیری آنها در نوشتن قوانین دوباره نویسی URL های وب مد نظر است.

پرچم ها (Flags) در htaccess


قسمت آخر در تعریف قوانین دوباره نویسی آدرس های وب استفاده از پرچم ها (Flags) است به صورت [flag1,flag2,flag3] نوشته می شوند، با پرچم ها می توانیم نحوه پردازش دستورات را در فایل htaccess مدیریت کنیم، پرچم ها عمدتا در دو شکل مختصر و کامل (به فرض L یا last) قابل استفاده هستند اما معمولا شکل کوتاه آنها به کار می رود، این عبارات دستوری طیف های متنوعی دارند و هر کدام با هدف خاصی به کار می روند که در ادامه چند مورد از مهمترین ها را بررسی می کنیم:
- پرچم END:
این پرچم اجرای دستورات htaccess را در نشست جاری به طور کامل متوقف می کند، البته تفاوت آن با L در این است که اگر چند فایل htaccess در دایرکتوری اصلی و دایرکتوری های زیرمجموعه داشته باشیم، با END اجرای تمام این فایل ها متوقف می شود اما با L صرفا فایل حاوی این دستور اجرایش متوقف می شود:
RewriteEngine On
RewriteRule ^index/([0-9]+)$ /index.php?page=$1[NC,END]
- پرچم F یا forbidden:
در صورت استفاده از این پرچم و تطبیق الگو با آدرس URL درخواستی، سرور خطای وضعیت Forbidden 403 برمی گرداند:
RewriteRule "\.exe" "-" [F]
این قانون اجرای فایل های با پسوند exe از طریق فراخوانی آدرس URL را در سایت ممنوع می کند.
- پرچم L یا last:
با اجرای قانون متناظر با این پرچم، مفسر دیگر قوانین را در فایل جاری نادیده می گیرد:
RewriteRule ^posts/([0-9]+)-(.*)\.html$ posts.php?id=$1 [NC,L]
تفاوت پرچم L با END در این است که با اجرای پرچم END تمام قوانین چه در فایل فعلی و چه در دیگر فایل هایی که ممکن است در دایرکتوری های زیرمجموعه ریشه سایت وجود داشته باشند خاتمه می یابند اما پرچم L صرفا اجرای ادامه قوانین را در فایل htaccess جاری متوقف می کند.
پرچم NC یا nocase:
در صورت درج این پرچم بزرگ یا کوچک بودن حروف اهمیتی ندارد و الگوی قانون در هر دو حالت تطبیق پیدا می کند:
RewriteRule "(.*\.(jpg|gif|png))$" "http://images.example.com$1" [NC]
در این مثال بزرگ یا کوچک بودن فرمت فایل ها مهم نیست و در صورت تطبیق با الگو قسمت دوم قانون برای سرور دریافت می شود.
پرچم QSA یا qsappend:
اگر آدرس درخواستی از سرور یک یا چند پارامتر داینامیک داشته باشد، به فرض:
http://example.com/news/123/?cat=2&title=this-is-easy
در حالت عادی پارامترهای داینامیک در قانون دوباره نویسی دخیل نمی شوند و قابل بررسی هم نیستند، به طور مثال اگر قانون زیر را داشته باشیم و کاربر آدرس بالا را از سرور درخواست کند:
RewriteRule ^news/(.*)$ news.php?url=$1 [NC,L]
در نهایت آدرس زیر برای استفاده در سرور دریافت می شود:
news.php?url=123
اما اگر قانون را با افزودن پرچم QSA به شکل زیر تغییر دهیم:
RewriteRule ^news/(.*)$ news.php?url=$1 [QSA,NC,L]
آدرس نهایی برای سرور به این صورت خواهد بود:
news.php?url=123/?cat=2&title=this-is-easy
پرچم R یا redirect:
برای انتقال کاربر از آدرس فعلی به آدرس مد نظرمان از پرچم R یا عبارت redirect استفاده می کنیم، این انتقال می تواند به همراه تنظیم کدهای وضعیت سری 300 الی 399 باشد، به طور مثال قانون زیر آدرس درخواستی را به صورت همیشگی (Permanently) به URL جدید منتقل می کند:
RewriteRule ^old-([0-9]+)$ new-$1 [R=301,NC,L]
برای تنظیم عدد متناظر با وضعیت HTTP از علامت = در مقابل R استفاده می کنیم.
نکته: پرچم R باید به همراه پرچم L استفاده شود، فلسفه این کار مشخص است، با ریدایرکت در واقع قصد اتمام پردازش آدرس درخواستی جاری و انتقال به آدرس جدید را داریم و لذا پردازش ادامه قوانین در نظر گرفته شده برای URL فعلی منطقی نیست و ممکن است با خطاهای ناخواسته مواجه شویم.
تعداد پرچم های قابل استفاده در هنگام نوشتن قوانین دوباره نویسی به موارد گفته شده ختم نمی شود، برای آشنایی بیشتر می توانیم به لینک زیر رجوع کنیم:
https://httpd.apache.org/docs/2.4/rewrite/flags.html

تعیین شرط و پارامترهای آن در دستورات htaccess


یکی از قابلیت های کاربردی که ماژول mod_rewrite در اختیارمان قرار می دهد امکان تعیین شرط یا Rewrite Conditions با شیوه نگارش (Syntax) زیر است:
RewriteCond TestString CondPattern [Flags]
اما تعیین شرط چه کاربردی دارد؟
در هنگام نوشتن قوانین دوباره نویسی مواردی پیش می آید که بخواهیم اجرای یک قانون را منوط به وجود شرایطی کنیم، یعنی ابتدا بررسی کنیم اگر شرایط مد نظرمان محقق شده بود قانون بعد از آن اجرا شود، مثال:
RewriteCond "%{QUERY_STRING}" "hack" [NC]
RewriteRule "." "-" [F]
این دستور تمام آدرس هایی که قسمت بعد از علامت ? (Query String) در آنها شامل کلمه hack باشد را مسدود (403 Forbidden) می کند.
تعداد شروط برای یک قانون می تواند بیش از یک مورد باشد، به طور مثال اگر بخواهیم یک استثنا برای قانون بالا تعریف کنیم که به فرض اگر کوکی شامل عبارت debug از مرورگر دریافت نشد قانون اجرا شود، خواهیم نوشت:
RewriteCond "%{QUERY_STRING}" "hack" [NC]
RewriteCond %{HTTP_COOKIE} !debug [NC]
RewriteRule "." "-" [F]
هر دو شرط بالا باید برقرار باشند تا قانون اجرا شود، در واقع به صورت پیش فرض برای دو شرط پرچم AND استفاده می شود اگر نیاز است که صرفا با برقراری یک شرط قانون اجرا شود می توانیم از پرچم OR (ornext) استفاده کنیم:
RewriteCond "%{QUERY_STRING}" "hack" [NC,OR]
RewriteCond %{HTTP_COOKIE} !debug [NC]
RewriteRule "." "-" [F]
پرچم OR صرفا در قسمت شرط ها قابل استفاده است نه در قسمت قوانین که این به فلسفه تعریف این پرچم بر می گردد.
همان طور که در نمونه دستورات بالا مشخص است در قسمت اول هر شرط پارامترهایی به شکل 
 %{NAME_OF_VARIABLE}
مشاهده می شود که به آنها متغیرهای سرور می گوییم، این متغیرها بسته به مورد می توانند شامل اطلاعات مختلفی از مرورگر کاربر و امکانات سرور باشند که در جدول زیر آمده است:
HTTP HeadersConnection & RequestServer Internals
HTTP_ACCEPT
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_REFERER
HTTP_USER_AGENT
AUTH_TYPE
CONN_REMOTE_ADDR
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT
IPV6
PATH_INFO
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_PORT
REMOTE_USER
REQUEST_METHOD
SCRIPT_FILENAME
DOCUMENT_ROOT
SCRIPT_GROUP
SCRIPT_USER
SERVER_ADDR
SERVER_ADMIN
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
Date & TimeSpecials
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
CONN_REMOTE_ADDR
HTTPS
IS_SUBREQ
REMOTE_ADDR
REQUEST_FILENAME
REQUEST_SCHEME
REQUEST_URI
THE_REQUEST
نکته: گروه هایی که در قسمت Rewrite Rule تعریف می کنیم با کاراکتر $ (دلار - Dollar) و عدد متناظر گروه قابل دریافت هستند، اما گروه های به کار رفته در قسمت Rewrite Conditions را با کاراکتر % (درصد - Percent) می توانیم در قانون خود داشته باشیم، به طور مثال:
RewriteCond "%{DOCUMENT_ROOT}" !-f
RewriteCond %{HTTP_HOST} ^(sub.example.com)$
RewriteRule ^/?([a-z]+)/([0-9]+)$ /panel.php?action=$1&page=$2&host=%1
اینها قوانین قراردادی در شیوه نگارش (Syntax) دستورات htaccess هستند و فلسفه قابل ذکر دیگری برای آن وجود ندارد.
در قسمت دوم RewriteCond بسته به هدف از نوشتن شرط موارد زیر قابل استفاده هستند:
- بررسی منفی (برابر نبودن) با علامت !، مثال:
RewriteCond %{REQUEST_FILENAME} !-d
این شرط بررسی می کند که فایل درخواستی با نام یک دایرکتوری در سرور برابر نباشد.
- مقایسه با علامت های <=> برای مقادیر رشته ای یا عدد، مثال:
RewriteCond %{HTTP_USER_AGENT} "=This Browser/Ver 28.0"
این مقایسه برابر بودن متغیر سرور HTTP_USER_AGENT که معمولا حاوی اطلاعاتی از مرورگر کاربر است را با رشته متنی در نظر گرفته شده در دابل کوتیشن بررسی می کند.
این قسمت در حال بازنویسی و ویرایش است...

چند مثال کاربردی دوباره نویسی آدرس های وب (URL Rewrite)


به دلیل پیچیده به نظر رسیدن موضوع در نگاه اول، شاید بهترین روش برای یادگیری نحوه دوباره نویسی لینک ها در 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 مطالب بیشتر:
» مقایسه خطای 404 و کد 301 ریدایرکت (Redirect)
» پیج رنک چیست و چگونه می توان آن را افزایش داد؟
» چرا برخی سایت ها و وبلاگ ها رتبه الکسای بهتری دارند؟
» چگونه سایت یا وبلاگ را برای موتورهای جستجو بهینه سازی کنیم؟
» رتبه بندی الکسا (Alexa) چیست و چقدر اهمیت دارد؟!
commentنظرات (۱۶۸ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: زینب
۱۲:۰۱ ۱۳۹۸/۰۳/۱۲
بله
اما برای لینک دوم و سوم باز هم علامت سوال میاد و میره صفحه دیگه میخواستم همون صفحه اصلی تمام فایل ها اجرا بشن مثل فایل home
پاسخ: 
راه حل تست شده، با این حال لطفا فایل هایتان را مجددا آپلود کنید تا بررسی کنیم، ممکن است موردی از قلم افتاده باشد.
نویسنده: زینب
۱۲:۱۹ ۱۳۹۸/۰۳/۱۲
از لطفتون خیلی ممنونم
فایل
حذف شد
آدرسها به این شکل نمایش داده میشن
http://localhost/test-1/one/?one=1
میخواستم به این شکل
http://localhost/test-1/one/
باشن
پاسخ: 
آدرس های URL را با علامت / در انتها درج کنید! مثال:
<a href="home/">خانه</a><br>
مشکل رفع می شود.
نویسنده: زینب
۱۰:۰۵ ۱۳۹۸/۰۳/۱۳
سلام
بی نهایت از لطفتون ممنونم وقت گذاشتید تا مشکل بر طرف کنید .
درست شد برنامه ممنون
نویسنده: sahel
۱۸:۰۸ ۱۳۹۸/۰۴/۰۸
سلام
وقت بخیر
برنامه من یه مشکلی داره که میخواستم با htaccess کدهای ErrorDocument حل کنم که نشد!
برنامه به این صورت
صفحه اول . صفحه اصلی
صفحه دوم . ثبت نام
صفحه سوم . اکشن مربوط زمانی که اطلاعات فرم ثبت نام به صفحه submit_register.php ارسال میکنند.
وقتی روی دکمه ثبت نام کلیک میشود. با کمک اکشن فرم به فایل submit_register.php میرود.
وقتی دکمه قبلی مرورگر میزنند به صفحه قبلی میرود یعنی صفحه ثبت نام.
حالا در چنین شرایطی میخواستم وقتی در صفحه ثبت نام هستند. دکمه صفحه بعدی مرورگر را میزنند. خطا Document Expired نمایش نده و بتوانم خطا صفحه کنترل کنم
پاسخ: 
این حالت مربوط به مرورگرها است و با دستورات htaccess که به سرور ارتباط دارند قابل رفع نیست، در صورتی که نیاز به این نوع رابط کاربری دارید شاید بهتر است از فناوری Ajax برای طراحی رابط کاربری استفاده کنید، همچنین کدهای زیر را در قسمت ابتدای صفحات PHP پیش از چاپ هر نوع خروجی درج و امتحان کنید:
 header("Cache-Control: max-age=900, must-revalidate");

ini_set('session.cache_limiter','public');
session_cache_limiter(false);
نویسنده: اکبری
۱۱:۲۸ ۱۳۹۸/۰۴/۱۲
سلام
روز بخیر
من از طریق کدهای htaccess برای صفحه اصلی تنظیمات انجام دادم که وقتی web.com/home وارد میکنند صفحه اصلی نمایش بده اما وقتی web.com وارد میکنند باز هم صفحه اصلی نمایش میدهد میخواستم اتوماتیک به web.com/home ریدایرکت شود.
باید چه کاری انجام بدهم؟
پاسخ: 
می توانید از دستورات htaccess زیر برای ریدایرکت خارجی صفحه اصلی استفاده کنید:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
در صورتی که ریدایرکت خارجی مد نظر نباشد:
RewriteEngine On
RewriteRule ^$ /home [L]
نویسنده: Zeynab
۲۲:۴۲ ۱۳۹۸/۰۵/۲۳
سلام . وقت بخیر .
من از کدهای htaccess برای سایت استفاده کردم . روی لوکال هاست مشکلی ندارم اجرا میشن .
حالا میخواستم روی هاست رایگان گیگفا اپلود کنم نمیشه !
باید چیکار کنم ؟
مشکل از کجاست ؟ ممکنه از رایگان بودن هاست باشه ؟
پاسخ: 
بله، برای اطمینان صفحه تست با نام test.html را در ریشه سایت بسازید و درون آن محتوای دلخواه درج کنید، سپس دستور زیر را در فایل htaccess قرار دهید:
DirectoryIndex test.html
در صورتی که امکان htaccess در سرور فعال باشد محتوای صفحه اصلی، فایل تست خواهد بود.
روش دیگر درج دستورات نامعتبر (به فرض abcd) در فایل htaccess است که در صورت فعال بودن با اجرای آدرس سایت باید خطای 500 Internal Server Error دریافت کنید.
نویسنده: محمد حسین
۱۴:۵۱ ۱۳۹۸/۰۷/۰۱
سلام وقت بخیر. من واسه قسمت برچسب های سایتم میخوام لینکی شبیه به
example.com/?tag=برچسب-اول
رو که مقدار پارامترش فارسیه به لینکی شبیه به
example.com/tags/برچسب-اول
بازنویسی کنم. چطور این کار رو انجام بدم؟
پاسخ: 
برای بازنویسی این حالت می توانید از نمونه قانون زیر استفاده کنید:
RewriteEngine On
RewriteRule ^tags/([^/]+) /?tag=$1 [NC,L]
نکته: دقت داشته باشید بین قوانین نباید تداخل و همپوشانی وجود داشته باشد.
نویسنده: سارا
۱۸:۲۶ ۱۳۹۸/۰۷/۰۶
سلام
ممنون برای سایت خوبتون
من یک اشتباهی کردم دو تا فایل htaccess دارم
یک فایل در مسیر اصلی سایت قرار دارد
C:\xampp\htdocs\htaccess 
و فایل دوم در پوشه panel که مربوط به پنل کاربری هست
C:\xampp\htdocs\panel\htaccess 
میخواستم محتوای فایل دوم در فایل اول قرار بدهم
باید چه کدهایی اضافه کنم؟
این کار انجام میدم کلا تمام مسیرهایی که مربوط به پنل کاربری هست از بین میره .
پاسخ: 
ارئه پاسخ دقیق نیاز به بررسی و تست دارد اما در کل برای ترکیب صحیح دو فایل htaccess باید دستورات فایل مبداء را مورد به مورد بررسی کنید و هر کدام که مبتنی بر آدرس نسبی دایرکتوری بود را با افزودن فولدر panel مجددا آدرس دهی کنید، به فرض اگر دستور فعلی به این شکل بود:
RewriteRule ^action/([^/]+) /?action=$1 [NC,L]
بعد از انتقال باید متناسب با دایرکتوری فعلی نوشته شود:
RewriteRule ^action/([^/]+) /panel/?action=$1 [NC,L]
نویسنده: حجت
۱۷:۰۳ ۱۳۹۸/۰۸/۰۴
با عرض سلام و خسته نباشید
بنده میخواستم لینک زیر رو
example.ir/49/blogtitle.html
به لینک
example.ir/blog.php?tag=49&title=blogtitle
دایرکت کنم تو htaccess کد زیر رو نوشتم ولی کار نمی کنه و پیغام
"The requested URL was not found on this server."
تو مرورگر نمایش داده می شه لطفا راهنمایی فرمایید. با تشکر.
کد htaccess:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)\.html$ /blog.php?tag=$1&title=$2 [NC,L]
پاسخ: 
باید مطمئن شوید که امکان htaccess در سرور فعال است، برای اطمینان دستورات نامعتبر (به فرض abcd) در فایل htaccess درج کنید، در صورت فعال بودن با اجرای آدرس سایت خطای 500 Internal Server Error نمایش داده می شود، همچنین دستور زیر را امتحان کنید:
RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)\.html$ /blog.php?tag=$1&title=$2 [NC,L]
دقت کنید که قوانین با هم تداخل و همپوشانی نداشته باشند.
نویسنده: حجت
۱۰:۲۸ ۱۳۹۸/۰۸/۰۶
خیلی ممنونم از لطف شما.
اوکی شد.
نویسنده: حسن
۱۴:۱۰ ۱۳۹۸/۱۱/۰۵
من مطابق کد نوشته شده شما میخواستم آدرس
https://www.dalgasozluk.com/index.php?word=gel
را به آدرس
https://www.dalgasozluk.com/word/ah
تغییر بدم. کد فایل htaccess به صورت زیر هست:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^word/([^/]+) /?word=$1 [NC,L]
</IfModule>
پاسخ: 
کد دستور نوشته شده به لحاظ نگارش مشکلی ندارد، در صورتی که دستور آنطور که باید عمل نمی کند یا با خطا مواجه شده اید لطفا با جزئیات بیشتری مشکل را مطرح کنید تا امکان راهنمایی میسر باشد.
نویسنده: میکاییل
۰۲:۳۰ ۱۳۹۹/۰۲/۲۹
سلام
من پروزه ای دارم با mvc نوشته شده و در روت سایت فایل htacsess دارم که کد های زیر توشه
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
خب تو url مسیر یک فایل من به این صورته مثال
test.com/product/index/24
اینجا این وسط ایندکس نمیخوام باشه. صفحه پروداکت داخل ویوو هست و داخل پروداکت ایندکس... اون فایل رو هم هرچقدر دستکاری میکنم سایت خراب میشه!
سوال دوم اینکه من میخوام مثل اینستاگرام بعد از ادرس سایت یوزر نیم بیاد. خب این با چه روشیه . خب مسلما داخل پوشه ای قرار داره اما تو ادرس بار این پوشه نیست
مثل
test.com/page/mika
test.com/mika
پاسخ: 
در مورد سوال اول دوباره نویسی آدرس ها باید با بررسی دقیق ساختار برنامه و آزمایش و خطا صورت گیرد، با توجه به توضیحات شاید افزودن دستور به شکل زیر مشکل را رفع کند:
RewriteEngine On
RewriteRule ^product/([0-9]+)$ index.php?url=product/index/$1 [L]
.
.
.
ادامه دستورات
در این ویرایش آدرس های سایت باید به شکل نمونه زیر باشند و صرفا عدد 24 می تواند مقادیر متفاوتی باشد:
test.com/product/24
سوال دوم هم به بحث دوباره نویسی آدرس ها مرتبط است، البته چون دستورات فعلی در فایل htaccess سایتتان کلی است نمی توانید این شکل آدرس داشته باشید:
test.com/mika
قانون این آدرس با آدرس های دیگر سایت تداخل می کند، برای رفع مشکل باید کل ساختار بازنویسی شود!
نویسنده: محمد امین
۱۸:۲۸ ۱۳۹۹/۰۴/۱۱
سلام ممنون از مطلبتون
ببخشید من یه سایتی با شی گرایی کامل زدم الان میخوام آدرسشو بهینه کنم آدرس الان من به این صورته:
localhost/site/page.php?proid=50
میخوام این آدرس تبدیل شه به :
localhost/site/page/50
لطفا خیلی بزرگی میکنید اگه راهنماییم کنید هر کاری کردم نشد نمونه کدی که تو htaccess نوشتم اینه
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA]
الان با این کدی که نوشتم تو صفحه index.php هرچی مینویسم به شکل query string ولی مشکل اینجاست که نمیدونم چه جوری page.php?proid=50 رو تبدیل کنم به page/50 خیلی ممنون
پاسخ: 
با توجه به توضیحات احتمالا برای دوباره نویسی این الگو نیازی به Query String نیست، باید لینک های خروجی در سایت را به شکل نمونه زیر داشته باشید:
localhost/site/page/50

در این ساختار صرفا باید عدد 50 بین صفحات مختلف متفاوت باشد، سپس در htaccess دستورات زیر را قرار دهید تا لینک استاتیک به صورت داینامیک در سرور دریافت شود:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^site/page/([0-9]+)$ site/page.php?proid=$1 [L]
با این دستور لینک استاتیک برای صفحه page.php به صورت داینامیک پردازش می شود (شکل لینک استاتیک است اما در واقع در سرور به صورت پارامتر با کاراکترهای ؟ = & دریافت می شود).
نکته: این دستورات با توجه به توضیحات و نمونه لینک های درج شده هستند، قاعدتا دوباره نویسی برای کل سایت نیاز به بررسی تکمیلی و عدم تداخل دستورات دارد.
نویسنده: مهدی
۰۹:۵۵ ۱۳۹۹/۰۴/۲۳
سلام من از کد زیر استفاده کردم
RewriteEngine On
RewriteRule ^login 3SotWeb/crm-company/crmforcompany/examples/login.php [NC,L]
ولی وقتی که اعمال میشه کل css های سایتم میپره.. چه باید بکنم
پاسخ: 
برای رفع این مشکل از آدرس دهی مطلق (آدرس کامل و شروع با http) در قسمت href تگ های link به فایل های CSS استفاده کنید، همچنین در برخی شرایط ممکن است نیاز به در نظر گرفتن یک شرط قبل از اجرای قانون مربوطه (RewriteRule) باشد:
RewriteCond %{REQUEST_FILENAME} !-f
با این شرط قانون دوباره نویسی روی فایل ها اعمال نمی شود که در برخی موارد ممکن است مشکل ساز باشد.
نویسنده: sepideh
۱۷:۱۱ ۱۳۹۹/۰۴/۲۳
سلام. من یک لندینگ پیج رو به صفحه اصلی سایت ریدایرکت 301 کردم. اگر بخوام تمام لینک های داخلی لندینگ رو (صفحات دنباله) رو هم به صفحه اصلی ریدایرکت کنم از چه دستوری باید استفاده کنم؟ مثلا:
domain.com/landingpage/aaaaa
رو به
domain.com
پاسخ: 
با درج دستور زیر در فایل htaccess می توانید دایرکتوری landingpage و تمام ساب دایرکتوری های آن را به صفحه اصلی ریدایرکت کنید:
RewriteEngine On
RewriteRule ^(landingpage/). / [R=301,L]
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ کوتاه و مختصر داده خواهد شد!
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.





1 × 3
 refresh
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form عاطفه مرادی
در:
سلام. من تازه یادگیری html رو شروع کردم و برای وبسایتمون برروی کنترل پنل html می نویسم. از طراح وبسایت خواستم که دسترسی جاوا را...
۱۳۹۹/۰۵/۱۹

form Amir Rahimi
در:
سلام و خسته نباشید من یک سوالی داشتم که مربوط به این بحث نیست سوال من اینه که یه کد یا . ....
۱۳۹۹/۰۵/۱۸

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

form shayan
در:
با سلام وقت به خیر من میخوام تو یه زبانه ای که در واقع متن قرار دادم لینک اسکرول بالا در حده پیکسل...
۱۳۹۹/۰۵/۱۷

form mahtab
در:
ببخشید اگه انتی ویروس رو غیرفعال کنیم برای باز کردن وب که باز نمیشه دوباره میتونیم آنتی ویروس رو فعال کنیم ؟؟ ...
۱۳۹۹/۰۵/۱۵

form امیرمحمد خلیلی
در:
ببخشید چجوری میتونم یه عکس از کاربر بگیرم و نمایشش بدم؟
۱۳۹۹/۰۵/۱۵

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

form سفی
در:
سلام و خسته نباشید من فایل آموزش html مقدماتی رو دیدم اما وقتی روی index.html کلیک راست کردم این گزینه ++edit..c رو ندیدم چه برنامه...
۱۳۹۹/۰۵/۱۰

form dnmax
در:
ببخشید ما اگه بخواهیم در وبلاگ مان به بقیه کدهای جاوا بدهیم وقتی کد رو پست میکنیم کد نشان داده نمیشود مثلا کد پخش آهنگ...
۱۳۹۹/۰۵/۰۹

form علیرضا
در:
سلام خیلی ممنون بابت مطالب مفیدتون عاالی بودن ان شالله همیشه موفق باشین.
۱۳۹۹/۰۵/۰۹

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

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

form neda
در:
با سلام من سایتی زدم از نظر ریسپانسیو هم اکی هست. فقط ارتفاعش از مانیتورهای مختلف به یک اندازه نیست. برای div اول ارتفاع...
۱۳۹۹/۰۵/۰۷

form الهام
در:
سلام یه سوال داشتم که هرچی سرچ کردم جوابش پیدا نشد چجوری ادامه مطلب رو با کلیک روی کلمه مثلا بیشتر... ببینیم؟ ...
۱۳۹۹/۰۵/۰۶

form فاطمه
در:
سلام و خسته نباشید من اومدم برای وبم کد نظرات جدید درج کنم و اتفاقی یه بخش بزرگی از کدها رو حذف کردم و...
۱۳۹۹/۰۵/۰۵
form دینا
در:
چطور نظرات خصوصی که واسه وبلاگم مینویسن پاسخ بدم
۱۳۹۹/۰۵/۰۳
form میثم
در:
سلام من برای دریافت چند تا اطلاعات از جداول سایتم مجبور شدم دستور زیر رو اجرا کنم. هر کدام از جداول حدود ۱.۰۰۰.۰۰۰...
۱۳۹۹/۰۵/۰۱
form علی
در:
با سلام و تشکر فراوان اگر یک div خودش درون div دیگری باشد مثل مثال زیر مقدارش رو چطور به دست بیاریم؟ در...
۱۳۹۹/۰۵/۰۱
form mahtab
در:
خیلی میبخشین بفرمایین
۱۳۹۹/۰۴/۳۱
form علی
در:
با سلام و درود فراوان با چه فرمانی میشه content یک متاتگ رو به دست آورد. مثلا یه لینکی رو بدیم و content مورد...
۱۳۹۹/۰۴/۳۰
form فاطمه
در:
سلام چرا وبلاگ ها برام بالا نمیاد فقط بخش مدیریت میاد وقتی میزنی مشاهده وبلاگ نمیاد وبلاگ دوستانم نمیاد حتی وبلاگ های دیگه...
۱۳۹۹/۰۴/۲۸
form امیر
در:
سلام می خواستم بپرسم چگونه می شه در وبلاگ خود هنگامی که بادید کننده وارد وبلاگ می شه آهنگ خودکار پخش بشه . ممنون...
۱۳۹۹/۰۴/۲۶
form mahtab
در:
سلام ببخشید من که اینو نوشتم شما هم جواب دادین : ببخشین چرا وبلاگ من تو لبتاپ دوستم باز نمیشه ؟؟؟ واسه...
۱۳۹۹/۰۴/۲۶
form مهدی
در:
سلام حالتون خوبه؟ ببخشید هی مزاحمتون میشم.. یک سوالی داشتم من عملیات ری رایت رو میخوام تو سی پنل انجام بدم صفحه لوگین رو باز...
۱۳۹۹/۰۴/۲۶
form مهدی
در:
خیلی خیلی ممنونم از وقتی که گذاشتید.. لطف کردید
۱۳۹۹/۰۴/۲۴
form mahtab
در:
ببخشین چرا وبلاگ من تو لبتاپ دوستم باز نمیشه ؟؟؟ واسه ی ویروس هم اسکن کرده اما نوشته چیزی نیس چیکار کنیم ؟؟؟؟ ...
۱۳۹۹/۰۴/۲۴
  در انتظار بررسی: ۰
 پاسخگویی به سوالات 1 تا 48 ساعت زمان می برد.