شنبه ۲۹ فروردین ۱۴۰۵

Saturday, April 18, 2026 GMT +3:30
دسته بندی
×

دوباره نویسی آدرس های وب (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 - هدف/جایگزین) را بازنویسی می کند، در واقع پارامتر اول در قسمت الگو (home) منطبق بر ساختار URL استفاده شده در سایت و قسمت دوم قانون (index.php?q=home) همان آدرس نهایی بازنویسی شده برای استفاده در سرور و برنامه PHP است، به عبارتی قانون بالا از دو قسمت تشکیل شده است، در بخش اول آدرس درخواست شده از سرور بررسی می شود، اگر این آدرس با الگوی (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 را بررسی می کنیم.
نکته: اگر قوانین را درست و کامل ننویسیم معمولا خطای داخلی سرور با کد 500 یا همان HTTP Error 500 Internal Server Error دریافت خواهیم کرد.

عبارات با قاعده (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 بسته به هدف از نوشتن شرط موارد زیر به عنوان CondPattern قابل استفاده است:
- بررسی منفی (برابر نبودن) با علامت !، مثال:
RewriteCond %{REQUEST_FILENAME} !-d
این شرط بررسی می کند که نام فایل درخواستی با یک دایرکتوری در سرور برابر نباشد.
- مقایسه با علامت های <=> برای مقادیر رشته ای یا عدد، مثال:
RewriteCond %{HTTP_USER_AGENT} "=This Browser/Ver 28.0"
این مقایسه برابر بودن متغیر سرور HTTP_USER_AGENT که معمولا حاوی اطلاعاتی از مرورگر کاربر است را با رشته متنی در نظر گرفته شده در دابل کوتیشن بررسی می کند.
- مقایسه با حروف دستوری خاص برای مقادیر رشته ای یا عدد، مثال:
RewriteCond %{HTTP_HOST} eq "example.com"
این حروف شامل:
eq مشتق از واژه equal to یا برابر با.
ge مشتق از سرواژه های greater than  و equal to به معنی بزرگتر از یا برابر با.
gt مشتق از سرواژه های greater than به معنی بزرگتر از.
le مشتق از سرواژه های less than و equal to به معنی کوچکتر از یا برابر با.
lt مشتق از سرواژه های less than به معنی کوچکتر از.
ne مشتق از سرواژه های not equal to به معنی برابر نبودن با (حالت حروفی کاراکتر دستوری !).
- بررسی صفت های مربوط به فایل و دایرکتوری، مثال:
RewriteCond /old/page/%{REQUEST_URI} !-f
RewriteRule ^(.+) /other/archive/$1 [R=301]
در ادامه برخی از پر کاربردترین کاراکترهای مربوط به بررسی فایل و دایرکتوری در htaccess را بررسی می کنیم:
d مشتق از سرواژه directory جهت بررسی وضعیت وجود و دایرکتوری بودن (یا در حالت منفی نبودن) آدرس.
f مشتق از سرواژه file جهت بررسی وضعیت وجود و فایل بودن (یا در حالت منفی نبودن) آدرس.
l مشتق از سرواژه link جهت بررسی وضعیت نمایشی (symbolic) بودن یا نبودن آدرس، لینک های سمبلیک یا نمایشی آدرس های URL ای هستند که منبع واقعی برای آنها در سرور وجود ندارد (به فایل خاصی اشاره نمی کنند) و صرفا جنبه نمایشی دارند، معمولا این سبک آدرس ها با دوباره نویسی برای سرور قابل فهم می شوند.
- استفاده از دستورات باقاعده (Regular Expressions)، مثال:
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteRule "^/images" "-" [F]
دستور بالا در شرط آدرس ارجاعی (Referer) را با هاست (Host) بررسی می کند، برای استفاده از دستورات باقاعده (Regular Expressions) لازم است که قسمت expr و strmatch مطابق با نمونه بالا در دستور وجود داشته باشد.

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


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

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


در این مثال آدرس صفحه اصلی را از index.html به index.php دوباره نویسی می کنیم:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html
RewriteRule ^index\.html$ http://example.com/index.php [R=301,L]
تفسیر دستور بالا:
اگر مقدار بازگشتی از متغیر سرور THE_REQUEST با حروف بزرگ انگلیسی به تعداد حداقل 3 و حداکثر 9 کاراکتر شروع و در این مقدار عبارت index.html نیز وجود داشت قانون بعدی اجرا شده و در صورتی که آدرس URL درخواستی با الگوی قانون مطابقت کند با پرچم R=301 که به معنی ریدایرکت همیشگی (Moved Permanently) است، کاربر از حالت index.html به آدرس http://example.com/index.php منتقل می شود.
نکته: متغیر THE_REQUEST شامل نمونه اطلاعات زیر است:
"GET /index.html HTTP/1.1"
انتقال از index.html به index.php را می توانیم بدون شرط نیز بنویسیم:
RewriteEngine on
RewriteRule ^index\.htm$ index.php [NC,R=301]

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


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

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


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

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


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

انتقال از آدرس بدون www به آدرس با www و برعکس


در مثال زیر دستوری تنظیم کرده ایم که اگر در آدرس درخواستی ورودی عبارت www تایپ نشده بود کاربر به آدرس با www هدایت شود:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]
برعکس این حالت یعنی انتقال از آدرس با www به آدرس بدون www (به اصطلاح non-www) را نیز با دستور زیر می توانیم تعریف کنیم:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
متغیر سرور HTTP_HOST معمولا شامل آدرس اصلی سایت است که از مرورگر دریافت می شود، به طور مثال example.com و REQUEST_URI قسمت بعد از آدرس سایت را شامل می شود.

دانلود غیر مستقیم فایل های PDF


یکی از کاربردهای جالب دوباره نویسی آدرس های وب در htaccess امکان ایجاد قابلیت دانلود غیر مستقیم فایل ها و پردازش ابتدایی آنها با دستورات PHP به فرض جهت بررسی مجاز بودن دسترسی کاربر است، به طور مثال:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.pdf$  /include/pdf.php?file=$1 [L,NC,QSA]
در این مثال در صورتی که کاربر فایلی با پسوند pdf را از سرور درخواست کند قبل از بارگذاری فایل در مرورگر (روند عادی) ابتدا در فایل pdf.php دریافت و پردازش مورد نظر اعمال می شود، به فرض اگر کاربر وارد سایت شده و مجاز به دانلود بود در نهایت با دستورات PHP فایل جهت دانلود به سمت مرورگر ارسال می شود.

حذف index.php از آدرس URL


از جمله کاربردهای استفاده از تکنیک دوباره نویسی آدرس های وب مخفی سازی تکنولوژی و زبان برنامه نویسی به کار رفته در ایجاد صفحات سایت و در عین حال داشتن آدرس های کوتاهتر و خواناتر است، به طور مثال می توانیم با نمونه دستور زیر عبارت index.php را از آدرس URL (با یک پارامتر) حذف کنیم:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?id=$1 [QSA,L]
طبق این دستور آدرس فرضی example.com/index.php?id=1 را می توانیم به صورت example.com/1 در سایت داشته باشیم.
نکته: با توجه به ساختار آدرس های سایت الگوی این سبک قوانین می تواند دامنه وسیعی از URL ها را شامل شود یا باعث ایجاد تداخل در قانون ها گردد، به همین دلیل و به صورت نمونه آیکن های ریشه سایت را با تعیین شرط از این قاعده مستثناء کرده ایم.

یادآوری مهم


در پایان این آموزش مجددا یادآور می شویم دوباره نویسی آدرس های وب باید با دقت بالا انجام شود، اشتباه در نحوه چینش قانون ها مخصوصا در مورد قوانین مشابه ممکن است موجب بروز اختلال در عملکرد عادی سایت شده یا سبب ایجاد مشکلاتی نظیر مطالب تکراری (Duplicate Content) گردد، بهتر است با سربرگ های HTTP آشنا و بر تکنیک ریدایرکت 301 (Moved Permanently) نیز تسلط کافی داشته باشیم و قبل از اعمال تغییرات در ساختار URL های سایت حتما همه ی جوانب را تست و از کدهای فعلی پشتیبان تهیه کنیم.
دسته بندی: مهارتهای وب » بهینه سازی
related مطالب بیشتر:
مشکلات رایج در کدنویسی معتبر و رفع آنها
رتبه بندی الکسا (Alexa) چیست و چقدر اهمیت دارد؟!
پیج رنک چیست و چگونه می توان آن را افزایش داد؟
مقایسه خطای 404 و کد 301 ریدایرکت (Redirect)
چرا برخی سایت ها و وبلاگ ها رتبه الکسای بهتری دارند؟
دیدگاه
more ۱۹۵ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
۰۱:۳۴ ۱۳۹۴/۰۴/۲۱
سلام
پیرو مشکلی که در نظرات قبلی گفتم مربوط به مشکل htaccess در سرور آپاچی و عدم دریافت صحیح تمامی کاراکترهای فارسی و پیدا کردن ایراد کار در اینجا مطرح میکنم تا شاید به درد کسی بخوره
مشکل فوق رو با کاملتر نوشتن کدهای htaccess میشه حل کرد در htaccess نوشتن
(*.)
به معنای any character هستش در صورتی که همانطور که گفتم کاراکتر فارسی 'م' (%D9%85) رو به عنوان کاراکتر نمیشناسه و ظاهرا line feed هستش اما با یه راه حل ساده اونم استفاده از
(*[.^])
به جای
(.*)
مشخص میکنیم که 'هر رشته ای' نه صرفا 'هر کاراکتری' اما یه سوال هنوز هم تو ذهنم مونده که اونهم دلیل تفاوت در نحوه کارکرد htaccess در هاستینجر با لوکال هاست هستش آیا دلیلش تفاوت سرور آپاچی نسیت به سرور موجود در هساتینجر هستش آیا میشه با آپدیت آپاچی و یا PHP این تفاوت رو رفع کرد ؟؟
ظاهرا تنظیمات سرور شما به صورت پیش فرض بر روی UTF-8 نیست، عبارت
%D9%85
در استاندارد UTF-8 تعریف شده است:
http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1536&number=128&names=-
که برای وب از حالت Percent-encoding آن استفاده می شود، شاید با بروزرسانی یا تغییر تنظیمات مشکل بر طرف شود، در هر صورت این مسئله فراگیر نیست و مشکل محدود به سرور فعلی می شود.
امین
۲۰:۱۲ ۱۳۹۴/۰۴/۲۰
سلام مجدد
ممنون مشکل از کد بود
اما باز مشکل بدون قالب نشون دادن سایت وجود داره . برای برطرف شدنش باید چکار کرد ؟
و اینکه در صفحه باز شده با ادرس جدید یعنی
http://domine.ir/user/file.php/3614434/5/
وقتی یک لینک به شکل
<a href="panel.php">پنل</a>
وجود داشته باشه با کلیک کردن روی لینک آخرین مقدار لینک یعنی 5 برداشته میشه و آدرس به شکل زیر میشه
http://domine.ir/user/file.php/3614434/panel.php
برای این باید چکار کرد ؟
باتشکر فراوان بایت راهنمایی شما
دو روش برای حل این مشکل وجود دارد:
- روش بهتر این است که لینک ها به صورت مطلق باشند، نه به صورت نسبی، به فرض به صورت
http://domine.ir/panel.php
باشند.
- روش دیگر استفاده از تگ base در HTML است که برای توضیحات آن لطفا در وب جستجو کنید.
امین
۰۸:۴۲ ۱۳۹۴/۰۴/۲۰
سلام و خسته نباشید
واسه این که لینک زیر رو در مرورگر وارد کنم
http://domine.ir/user/file.php/3614434/5/
و به شکل زیر دوباره نویسی شود
http://domine.ir/user/file.php?id=3614434&num=5
از کد زیر استفاده میکنم
RewriteEngine on
RewriteRule /(.*)/(.*)/ ?id=$1&num=$2
اما به صفحه اصلی سایتم منتقل میشم اونم بدون قالب ! فقط متن سایتم نشون داده میشه ؟ مشکل از کدی هست که نوشتم یا به سرور مربوط میشه؟
باتشکر
دستور شما ایراد دارد و باید به شکل زیر باشد:
RewriteRule ^user/(.*)/(.*)/ /user/file.php?id=$1&num=$2
مشکل
۰۰:۲۲ ۱۳۹۴/۰۴/۱۵
سلام دوستان
اگه جای این سوال تو این بخش نیست معذرت میخوام نتونستم قسمت سرورها رو توی سایت پیدا کنم و عجله هم داشتم
من سایتی رو دارم که آدرس وارد شده توسط کاربر رو توسط htaccess عوض میکنم و مشکلی نداره و کار میکنه
اومدم سایتمو با XAMPP بالا آوردم تا تست های سایتم رو سریعتر و راحتتر انجام بدم قبلا با XAMMP آشنایی داشتم واسه همین کلیه قسمتهای سایت رو به همراه MYSQL کاملا برقرار شد
در کمال ناباوری اشکالی در تغییر آدرس توسط htaccess مشاهده کردم پس از کلی بررسی که ایراد کار از کجاست متوجه شدم که وقتی در URL از حرف م استفاده شده باشه مشکل به وجود مییاد و htaccess نمیتونه به آدرس تعریف شده هدایت کنه و در نتیجه پیغام Not Found ظاهر میشه
مشکل فقط و فقط روی حرف م وجود داره به طور مثال وقتی آدرس زیر درخواست میشه:
http://localhost/post/تست اول
صفحه مورد نظر درست است اما در آدرس زیر:
http://localhost/post/آموزش
به دلیل اینکه از حرف م در اون استفاده شده مشکل به وجود مییاد و not found میده اینو هم بگم که توی سرور اشتراکی خودم از همین دستورات توی htaccess استفاده کردم و مشکلی وجود نداره پس دستورات مربوط به htaccess و PHP کاملا درسته و مشکل فقط توی Apache هستش اونم فقط حساس به حرف م
نمیدونم کد حرف م رو به عنوان کد back میشناسه یا چی که به هر حال مشکل داره !
کسی میتونه منو راهنمایی کنه مثلا میشه از کانفیگ های XAMPP مشکل رو حل کرد ؟؟
دیگه خودم چیزی به فکرم نمیرسه ....
به نظر نمی رسد مشکل از خود Apache باشد (هرچند ممکن است یک باگ در برنامه XAMPP باشد)، برای اطمینان یک فایل php ایجاد و حرف م را به عنوان پارامتر از طریق متد GET از این فایل درخواست کنید، همچنین در چند مرورگر مختلف فرآیند را تست نمائید، متاسفانه بدون دسترسی به سیستم (یا تست از طریق TeamViewer) راه دیگری برای حل این نوع موارد وجود ندارد!
majid
۱۸:۴۸ ۱۳۹۴/۰۳/۲۴
سلام
من همه کار ها رو کردم مشکل اینجاست که....
وقتی نشانی صفحه رو وارد می کنم حتما باید عدد باشه نشانی و حروف رو قبول نمی کنه
برای مثال :
http://www.domain.ir/news.php?namak=11
رو قبول می کنه ولی
http://www.domain.ir/news.php?namak=majid
رو قبول نیمکنه
می شه راهنمایی کنید
این htaccess هست....
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css|pdf|gif|ico|jpg|js|png|swf|pdf|txt|php)$
RewriteRule ^([^A-Za-z0-9].*)$ news.php?namak=$1 [L,QSA]

<?php
if(isset($_GET['namak']))
{
$newsnamak=clean($_GET['namak']);
$query = "SELECT * FROM news where namak=$newsnamak";
$result = mysql_query($query) or die(mysql_error());
$row=mysql_fetch_assoc($result);
حل این مشکل نیاز به تست دارد! منظورتان از "قبول نیمکنه" مشخص نیست! (آیا خطایی دریافت می کنید؟!) ممکن است پارامترها واقعا دریافت شوند اما اشکالی در قسمت دریافت اطلاعات از دیتابیس وجود داشته باشد، برای اطمینان از پارامتر با دستور echo خروجی بگیرید، اگر مقدار چاپ شود مشکل از دستورات htaccess نیست.
babak-maziar
۰۳:۰۸ ۱۳۹۴/۰۳/۱۴
سلام دوست گرامی
2 تا سوال دام
اول اینکه من یه url دارم به شکل
mysite.com/product.php?x=1
حالا با htaccess کدشو نوشتم که اگه کاربر
mysite.com/myword
وارد کرد
mysite.com/product.php?x=1
فراخوانی بشه. اما برعکسشو بلد نیستم، یعنی نمیدونم چه طوری میتونم بگم اگر هم کاربر
mysite.com/product.php?x=1
رو وراد کرد
mysite.com/myword
توی ادرس بار مرورگر نمایش داده بشه
سوال بعدیم اینه توی ویمستر چی باید وارد کنم که برای سئو خوب باشه؟
mysite.com/product.php?x=1
که حاوی کلمات کلیدی نیست و
mysite.com/mywor
هم که ثبت نمیشه
- برای مشکل اول باید ریدایرکت 301 را با استفاده از QUERY_STRING تنظیم کنید، جهت نمونه:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)x=([^&]+)&?(.*)?$
RewriteRule ^product\.php$ http://mysite.com/%3
- در مورد مشکل دوم متوجه منظورتان از "ثبت نمیشه" نشدیم، لطفا بیشتر توضیح دهید تا راهنمایی کنیم، در کل وقتی از دوباره نویسی استفاده می کنید، دیگر نباید از آدرس های داینامیک استفاده کنید.
سارا
۱۴:۵۰ ۱۳۹۴/۰۳/۱۰
با سلام
میخواستم آدرس زیر
search.php?s=Mohammad Bibak Ft. Kamran Motiee - Yek Roozeh Barfi_1431855166/**/محمد بیباک-یه روزه برفی
را به آدرس زیر تبدیل کنم یعنی تو مرورگر اینطوری نوشته بشود
search.php/Mohammad Bibak Ft. Kamran Motiee - Yek Roozeh Barfi_1431855166/**/محمد بیباک-یه روزه برفی
با سپاس
دوباره نویسی لینک ها باید با در نظر گرفتن کل ساختار سایت انجام شود، صرفا جهت نمونه و با توجه به نمونه آدرس های درج شده:
RewriteRule ^search.php/([^/]+)/([^/]+)/([^/]+) /search.php?S=$1/$2/$3 [NC,L]
محمد
۱۹:۳۲ ۱۳۹۴/۰۳/۰۳
سلام
من با ساخت فایل htaccess. مشکل داشتم ! چجوری فایلی بدون نام بسازم ؟ ویندوز ارور میده !
من به جای نام ، سیمبل فضای خالی گذاشتم و پسوند htaccess. نمیدونم کار درستی هست یا نه ولی جواب داد و type فایلو نوشت HTACCESS file
------
1 - این کار ، کار درستیه ؟
-----
این سوالو پرسیدم چون هرکاری میکنم لینکم دوباره نویسی نمیشه !
من با EasyPHP کار میکنم و تنظیمات مربوطه رو انجام دادم ، مثل
LoadModule rewrite_module modules/mod_rewrite.so
و
LoadModule headers_module modules/mod_headers.so
و
AllowOverride All
----
2 - آیا کاری دیگه ای هم باید انجام بدم ؟
3 - در فایل php.ini هم باید تغییری داده بشه ؟
----
لینک های من به این شکله :
http://127.0.0.1/MySite/index.php?page=Contact_us

و میخوام به این شکل دربیاد :
http://127.0.0.1/MySite/Contact_us
این هم کدی که نوشتم (دقیقا مثل نمونه ای که خودتون نوشتید)
RewriteEngine On
RewriteRule ^Contact_us /index.php?page=Contact_us [NC,L]
چون حروف کوچک و بزرگ استفاده کردم NC را هم برداشتم ولی بازم جواب نداد
نه اروری نه هیچ تغییری اصلا انگار نه انگار !!!
حتی تو هاست هم آپ کردم ولی جوابی نگرفتم
----
4 - چرا فایل htaccess. در cpanel پنهان هست و نمایش داده نمیشه ؟
- برای ساخت فایل htaccess. در ویندوز ساده ترین راه استفاده از برنامه Notepad و گزینه Save As است، در این قسمت از منوی کشویی All Files را انتخاب و برای نام فایل عبارت htaccess. را قرار دهید، این فایل باید بدون هیچگونه پیشوندی و صرفا به همین صورت باشد (چون عین فایل در تنظیمات سرور تعریف شده است)، اینکه ویندوز نوع فایل را htaccess نمایش می دهد صرفا به جهت پسوند است و برای اجرا در سرور کفایت نمی کند!
- نیازی به تغییر در فایل php.ini نیست!
- پنهان بودن این فایل بستگی به تنظیمات قسمت File Manager شما دارد، معمولا قسمتی به صورت چک باکس برای تائید نمایش فایل های مخفی وجود دارد که باید فعال باشد!
این موارد را اصلاح، تست و در صورت ادامه داشتن مشکل فایلتان را جهت بررسی از طریق ایمیل ما (موجود در بخش تماس) ارسال کنید.
طاهری
۱۷:۰۹ ۱۳۹۴/۰۲/۲۱
سلام خسته نباشید
سوالی از حضورتون داشتم در رابطه با
دوباره نویسی لینک (url rewrite) در htaccess هستش
من میخوام بدونم اگه بخوام مثلا آدرس
yoursite.com/74article/23-amoozesh-book
رو به
yoursite.com/amoozesh-book
تبدیل کنم باید از چه کدی استفاده کنم؟ خواهش میکنم جواب سوالم رو بدین برام در حد واجبه
باید مد نظر داشته باشید که دوباره نویسی لینک ها کار بسیار حساسی است و صرفا با دیدن دو الگو نمی توان راه حل عملی پیشنها داد چون ممکن است با ساختار دیگر لینک های سایت شما تداخل به وجود بیاید، صرفا جهت نمونه:
RewriteEngine On
RewriteRule ^([0-9]+)article/([0-9]+([\-]+)([^/]+) /$4 [NC,L]
نکته: کد تست نشده!
علی
۱۵:۴۳ ۱۳۹۴/۰۲/۲۱
با سلام دوباره و تشکر از جواب تان.
دنباله ی سوال قبل . اگر فرضا من به جای پست از گت استفاده کنم آیا ان وقت مشکل گفته شده در سوال قبل یعنی اینکه موتور های جستجو صفحه ی جستجوی سایتم را ایندکس کنند حل می شود؟ من درست متوجه نشدم ، برداشتم از جواب شما اینه که همه ی مطالب سایت (پایگاه داده) باید حتما دارای یک صفحه مشخص با لینک مشخص باشند .
یعنی من باید برای تمام مطالب ذخیره شده در بانک یک صفحه ایجاد کنم؟
اگر من تمام کلید واژه های مطالب سایتم را در همان صفحه ی جستجو به صورت مخفی قرار دهم آیا از نظر موتورهای جستجو خلاف است؟
با تشکر
مطالب یک سایت استاندارد به صورت مشخصی نمایش داده می شوند که نمونه آن سایت حاضر و تقریبا تمام سایت هایی است که از آنها استفاده می کنیم، این کار نیز اغلب توسط برنامه های مدیریت محتوا یا CMS و به صورت سیستماتیک انجام می شود و نیازی به صفحه بندی دستی نیست، هر مطلب با یک URL واحد و یکتا در دنیای وب مشخص و در دسترس است، در حالت جستجو صرفا متناسب با ورودی کاربر، لینک های مرتبط به او نمایش داده می شود تا بعد از کلیک به محتوای اصلی هدایت شود (کافی است قسمت جستجوی چند سایت را بررسی کنید)، در مورد مخفی کردن کلید واژه ها، اصولا مخفی کاری در این شکل در وب توصیه نمی شود، امروزه الگوریتم های موتورهای جستجو پیشرفته تر شده و ممکن است سایت شما را به طور کامل مسدود و یا از ایندکسشان حذف کنند.
علی
۱۹:۴۲ ۱۳۹۴/۰۲/۱۹
با سلام. یک سایت داریم با دو صفحه ، یکی صفحه ی اصلی و یکی صفحه ای که جستجو می کند و نتیجه را نشان می دهد. صفحه ی جستجو به این شیوه عمل می کند که پارامتر های دریافتی با متد پست از صفحه ی اصلی را در پایگاه داده جستجو می کند و نتیجه را نشان می دهد.
سوال اینجاست که آدرس صفحه ی جستجو همیشه search.php است اگر جستجویی انجام دهیم و مطالب صفحه جالب بود (از دید کاربر سایت) صفحه را بوک مارک می کنیم یعنی به علاقه مندی ها اضافه می کنیم. حال اگر روی صفحه ی بوک مارک شده در منوی علاقه مندی ها کلیک کنیم دیگر آن صفحه را مشاهده نمی کنیم بلکه php خطای پیدا نکردن متد پست را می دهد. راه حل چیست؟ توجه : به هیچ وجه امکان ارسال با متد گت نیست.
سوال دیگر اینکه آیا صفحه ی سرچ سایت در موتور های جستجو ذخیره می شود با این تعریفی که کردم؟ اگر نه چکار کنیم که بشود؟ و اگر بله سوال دیگری پیش می اید اینکه وقتی کاربر روی لینکی که مثلا گوگل به صفحه ی سرچ ما کرده کلیک می کند حتما باز همان خطا را مشاهده می کند درست است؟ پس باید چه کاری کرد؟
شرمنده که طولانی شد و جای درستی نپرسیدم
در وب برای رسیدن به یک مقصود چند روش ممکن است وجود داشته باشد، اما معمولا یک روش به دلایل مختلف متداول است، در مورد جستجو استفاده از متد POST چندان مرسوم نیست و اگر به خود سایت گوگل توجه کنید، پارامترهای جستجو در آدرس صفحه وجود دارند (متد GET)، لذا کار شما (استفاده از متد POST برای جستجو) در این حالت از پایه اشتباه است! نکته دیگر اینکه موتورهای جستجو اقدام به ارسال فرم های وب با محتوای اتفاقی نمی کنند تا بخواهند صفحات جستجو شده کاربران شما را پیدا یا حدس بزنند (هر چند دیده شده به ندرت برخی ماند Bing جهت کنجکاوی این کار را می کنند! اما هیچگاه تعداد این عبارات فرضی زیاد نبوده و موارد عمده ای را شامل نمی شود)، به عبارتی یک موتور جستجو صرفا صفحاتی را پیدا می کند که در حالت عادی (بدون ارسال شدن فرم و...) در دسترس باشند، با این حساب معمولا فقط صفحه search.php با محتوای اولیه ایندکس می شود و کاربران نیز به همین صفحه با هر محتوایی که در حالت عادی نمایش داده می شود هدایت خواهند شد، هیچ راه حل فوق العاده ای برای این موضوع وجود ندارد چون اصولا این یک مشکل نیست بلکه به تعریف اشتباه ساختار جستجوی سایتتان مربوط می شود، البته با توجه به قابلیت هایی که در وب در دسترس است، چند راه وجود دارد:
- می توانید در حالت استفاده از متد POST به کوکی ها تکیه داشته باشید (موارد دلخواه کاربران را در کوکی و در مرورگر آنها ذخیره کنید)، این روش تنها در همان مرورگر جواب خواهد داد.
- از متد GET یا ترکیب GET و POST استفاده کنید، این یک حالت استاندارد است، اصولا محتوای اصلی یک سایت باید با لینک های یکتا در دسترس باشند و تکیه به قسمت جستجو نداشته باشند، قسمت جستجو صرفا برنامه ای برای پیدا کردن محتوای اصلی است و خود آن تنها یک صفحه از سایتمان است (هرچند به صورت داینامیک نتایج را صفحه بندی کند).
طاهری
۱۳:۴۲ ۱۳۹۴/۰۲/۱۸
سلام ممنون از مطالب مفیدتون ، عذر میخوام میخواستم بدونم بعد از کوتاه کردن آدرس لینک در مرورگر هم همان آدرس کوتاه شده باید نمایش داده بشه؟ آخه من آدرس ها رو کوتاه کردم و البته با آدرس های کوتاه شده هم به مطلب مورد نظر میرسم ولی بازهم همون آدرس طولانی قبلی نمایش داده میشه؟ میخوام بدونم چطور میشه کاری کرد در مرورگر هم آدرس کوتاه شده نمایش داده بشه
آیا این کار رتبه ی سایت رو کاهش نمیده؟
سایت های ارائه کننده قابلیت لینک های کوتاه معمولا از روش ریدایرکت به لینک اصلی استفاده می کنند، در صورتی که این ریدایرکت با کد 301 HTTP باشد، به افزایش رتبه سایتتان کمک می کند، در غیر این صورت اثر منفی ندارد اما تاثیر مثبت آن کمتر است!، البته بهتر است لینک های اصلی سایتتان خیلی طولانی نباشند، در مورد تغییر آدرس مرورگر، این حالت طبیعی است و با ریدایرکت از سایت میانجی (لینک کوتاه) باید کاربر به آدرس اصلی (سایت اصلی) ارجاع داده شود، در غیر اینصورت اگر آدرس تغییر نکند، ممکن است ارزش محتوا برای سایتی محاسبه شود که آدرس آن در نوار آدرس مرورگر دیده می شود، سایت هایی که با تکنیک فریم محتوای دیگران را در دامنه خود نمایش می دهند می تواند نمونه خوبی برای حالت مد نظر شما باشد.
مصطفی
۰۸:۳۲ ۱۳۹۴/۰۱/۲۷
سلام و درود
من برای ریدایرکت حالت
domain.com/?ads=32
به
domain.com/ads-32-example.html
از کد زیر استفاده کردم و جواب داد
RewriteCond %{QUERY_STRING} ^ads=32$ [NC]
RewriteRule ^(.*)$ http://domain.com/ads-32-example.html? [R=301,L]
حالا نیاز به یک کدی دارم که دستور بالا را هوشمند کنه تا نیاز نباشه که برای هر آدرس اینترنتی این کار را انجام بدم
یعنی میخوام آدرس های زیر هم دقیقا به آدرس پیوند یکتای اون ریدایرکت بشه
domain.com/?ads=33
domain.com/?ads=34
domain.com/?ads=35
و ...
سپاس فراوان
یا علی
باید دستورات را بر اساس الگوی عبارات با قاعده بنویسید، مثال (تست نشده):
RewriteCond %{QUERY_STRING} ^ads=([0-9]+)$ [NC]
RewriteRule ^ads=([0-9]+)$ /ads-$1-example.html? [R=301,L]
همایون
۰۷:۰۴ ۱۳۹۳/۱۲/۲۹
سلام وقت بخیر
چجوری میتونم از # استفاده کنم مثلا آدرس:
example.com/id/#45

به:
example.com/id/45
تا آنجا که اطلاع داریم علامت # ارجاع به یک ID در صفحه است و این پارامتر در URL درخواستی از سرور پردازش نمی شود و قابل دسترسی نیست، لذا امکان استفاده از آن برای Rewrite وجود ندارد! تنها راه حل ترکیب روش با جاوا اسکریپت و Ajax است که خود مباحث جداگانه دارد.
اسماییل
۱۹:۲۳ ۱۳۹۳/۱۲/۲۷
سلام مطالبتون بسیار مفید هست
چه کدی باید در فایل htaccses قرار بدم که وقتی بازدیدکننده یه ادرس اشتباه از سایت رو وارد کنه یه پیغام بده مثل "این صفحه در سایت موجود نیست."
مثلا کاربر این ادرس رو بزنه درحالی که در سایت ما چنین ادرسی وجود نداره
www.mysite/page3
با استفاده از دستورات htaccess می توانید صفحات 404 پیش فرض سایتتان را تغییر دهید، برای این کار فایل (PHP، HTML و...) مورد نظر را در ریشه سایت (یا در یک دایرکتوری) قرار داده و نمونه دستور زیر را به htaccess خود اضافه کنید:
ErrorDocument 404 /error/404.php
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
4 × 5
20 × 20
=