آموزش ریدایرکت www به غیر-www با Apache در CentOS 7

به اشتراک بگذارید

how-to-redirect-www-to-non-www-with-apache-on-centos-7

فهرست مطالب

مقدمه

بسیاری از توسعه‌دهندگان وب نیاز دارند که کاربران بتوانند از طریق زیردامنه www و دامنه اصلی (غیر-www) به وب‌سایت یا برنامه آنها دسترسی داشته باشند. به این معنی که تجربه کاربری برای بازدید از www.my-website.com و my-website.com یکسان باشد. اگرچه روش‌های متعددی برای تنظیم این امکان وجود دارد، اما بهترین راهکار از نظر SEO انتخاب یکی از این دو دامنه (زیردامنه یا دامنه اصلی) به‌عنوان دامنه ترجیحی و ریدایرکت کاربران از دامنه دیگر به دامنه ترجیحی با استفاده از وب‌سرور است.

انواع مختلفی از ریدایرکت‌های HTTP وجود دارد، اما در این سناریو، استفاده از ریدایرکت 301 بهترین گزینه است. این ریدایرکت به کلاینت‌ها اعلام می‌کند: «وب‌سایتی که درخواست کرده‌اید به‌طور دائم به URL دیگری منتقل شده است. به جای آن به آنجا بروید.» پس از دریافت پاسخ HTTP 301 توسط مرورگر، درخواست دومی به URL جدید ارسال می‌شود و کاربر به وب‌سایت هدایت می‌شود، احتمالاً بدون اینکه متوجه ریدایرکت شود.

چرا وب‌سرور را طوری تنظیم نکنیم که وب‌سایت را برای هر دو نام دامنه ارائه دهد؟ این روش ممکن است ساده‌تر به نظر برسد، اما مزایای SEO ریدایرکت 301 را ندارد. ریدایرکت دائم به خزنده‌های موتور جستجو اعلام می‌کند که یک مکان اصلی (canonical) برای وب‌سایت شما وجود دارد و این کار رتبه‌بندی جستجوی آن URL را بهبود می‌بخشد.

در این آموزش، شما یک ریدایرکت 301 را با استفاده از Apache در CentOS 7 تنظیم خواهید کرد. اگر به جای Apache از Nginx استفاده می‌کنید، به آموزش «چگونه www را به غیر-www با Nginx در CentOS 7 ریدایرکت کنیم» مراجعه کنید.

پیش‌نیازها

برای تکمیل این آموزش، ابتدا به موارد زیر نیاز دارید:

  • دسترسی با امتیازات superuser روی سروری که Apache روی آن اجرا می‌شود. اگر این را تنظیم نکرده‌اید، راهنمای «تنظیم اولیه سرور با CentOS 7» را دنبال کنید.
  • نصب و پیکربندی Apache برای ارائه وب‌سایت شما. برای این کار، آموزش «نحوه نصب وب‌سرور Apache در CentOS 7» را دنبال کنید.
  • یک نام دامنه ثبت‌شده. اگر هنوز دامنه‌ای ندارید، می‌توانید یک دامنه رایگان از Freenom دریافت کنید. می‌توانید از هر ارائه‌دهنده DNS که دوست دارید (از جمله ثبت‌کننده دامنه) برای میزبانی رکوردهای دامنه خود استفاده کنید—فقط مطمئن شوید که ثبت‌کننده شما به nameserverهای ارائه‌دهنده اشاره می‌کند. اگر از DNS DigitalOcean استفاده می‌کنید، این مقاله از مستندات ما نحوه انجام آن را نشان می‌دهد.

حالا بیایید با پیکربندی رکوردهای DNS شروع کنیم.

مرحله اول: پیکربندی رکوردهای DNS

ابتدا باید هر دو www.my-website.com و my-website.com را به سرور Apache خود اشاره دهید. (در ادامه این آموزش فرض می‌شود دامنه شما my-website.com است. هرجا این دامنه را دیدید، آن را با دامنه خود جایگزین کنید.) این کار را با ایجاد یک رکورد DNS A برای هر نام که به آدرس IP سرور Apache شما اشاره می‌کند، انجام خواهید داد.

کنسول وب ارائه‌دهنده DNS خود را باز کنید. این آموزش از DNS DigitalOcean استفاده می‌کند.

در فرم افزودن دامنه، نام دامنه ثبت‌شده خود را در فیلد متنی وارد کنید و روی «Add Domain» کلیک کنید. این کار شما را به صفحه دامنه جدید هدایت می‌کند، جایی که می‌توانید رکوردها را مشاهده، اضافه یا حذف کنید.

در بخش «Create new record»، در فیلد HOSTNAME عبارت «@» را تایپ کنید. این کاراکتر ویژه نشان‌دهنده افزودن یک رکورد برای دامنه اصلی، یعنی my-website.com است. در فیلد WILL DIRECT TO، آدرس IPv4 عمومی سرور خود را وارد کنید و روی «Create Record» کلیک کنید. (نیازی به تغییر TTL نیست.)

برای رکورد دوم DNS، می‌توانید به جای رکورد A از یک رکورد CNAME استفاده کنید. رکورد CNAME یک نام مستعار است که به جای آدرس IP به نام دیگری اشاره می‌کند. می‌توانید یک CNAME ایجاد کنید که www.my-website.com را به my-website.com هدایت کند، و هر درخواست HTTP برای زیردامنه www به سرور شما می‌رسد، زیرا قبلاً رکورد A را برای دامنه اصلی ایجاد کرده‌اید. اما برای ساده نگه داشتن کار، یک رکورد A دیگر مانند اولی ایجاد کنید، با وارد کردن «www» در فیلد HOSTNAME و آدرس IP عمومی سرور در فیلد WILL DIRECT TO.

وقتی هر دو رکورد را ایجاد کردید، باید چیزی شبیه به این باشد:

رکوردهای A مورد نیاز

با وجود این دو رکورد، درخواست‌های وب برای هر دو my-website.com و www.my-website.com به سرور Apache شما می‌رسند. حالا بیایید سرور را پیکربندی کنیم.

مرحله دوم: پیکربندی ریدایرکت در Apache

وب‌سرور Apache دو ماژول برای کمک به پیکربندی ریدایرکت‌ها ارائه می‌دهد: mod_alias و mod_rewrite. اگرچه mod_rewrite قدرتمندتر است، اما mod_alias ساده‌تر و قابل‌فهم‌تر است. اگر نیاز به ریدایرکت درخواست‌هایی با query stringهای خاص یا هدرهای HTTP داشته باشید، باید از mod_rewrite استفاده کنید. بسیاری به دلیل قابلیت‌های تطبیق عبارات منظم (regular expression) از mod_rewrite استفاده می‌کنند که در mod_alias وجود ندارد. اما برای مورد ساده ریدایرکت تمام درخواست‌های www.my-website.com به my-website.com، ماژول mod_alias کافی است. (خود Apache توصیه می‌کند که در صورت امکان از mod_alias استفاده کنید، زیرا استفاده غیرضروری از mod_rewrite می‌تواند به پیکربندی‌هایی منجر شود که گیج‌کننده، شکننده و سخت برای نگهداری هستند.)

این ماژول به‌صورت پیش‌فرض در CentOS 7 فعال است، اما برای اطمینان، این دستور را اجرا کنید:

httpd -M | grep alias_module

اگر alias_module (shared) در خروجی ظاهر شد، ماژول از قبل فعال است. اگر نه، با افزودن این خط به فایل /etc/httpd/conf.modules.d/00-base.conf آن را فعال کنید:

echo “LoadModule alias_module modules/mod_alias.so” | sudo tee -a /etc/httpd/conf.modules.d/00-base.conf

با فعال بودن mod_alias، می‌توانید از دایرکتیوهای Redirect، RedirectMatch و سایر موارد ذکرشده در مستندات mod_alias در پیکربندی Apache استفاده کنید.

حالا بیایید VirtualHostها را پیکربندی کنیم.

همان‌طور که در پیش‌نیازها ذکر شد، وب‌سایت شما باید از قبل در Apache پیکربندی شده باشد. ممکن است در فایل پیکربندی اصلی Apache (/etc/httpd/conf/httpd.conf) یا در یک فایل جداگانه (مثلاً /etc/httpd/conf.d/my-website.com.conf) پیکربندی شده باشد. اگر از راهنمای نصب Apache که در پیش‌نیازها لینک شده استفاده کرده‌اید، ممکن است در فایلی مانند /etc/httpd/sites-available/my-website.com.conf باشد. هر کجا که سایت اصلی شما پیکربندی شده است، آن فایل را با vi یا ویرایشگر مورد علاقه خود باز کنید (اگر ترجیح می‌دهید، می‌توانید nano را با yum install nano نصب کنید):

sudo vi /etc/httpd/conf/httpd.conf

به دنبال دایرکتیوهای ServerAlias در VirtualHost بگردید. اگر خطی با ServerAlias تنظیم‌شده به www.my-website.com پیدا کردید، آن خط را حذف کنید. (یا اگر آن خط شامل چندین نام مستعار به‌صورت لیست جدا‌شده با کاما است، فقط www.my-website.com را از لیست حذف کنید.) این نام مستعار را باید حذف کنید، زیرا قرار است یک VirtualHost جداگانه برای زیردامنه ایجاد کنید که فقط شامل ServerName و Redirect باشد. VirtualHost اصلی سایت دیگر درخواست‌های www.my-website.com را ارائه نخواهد داد.

حالا یک VirtualHost جدید در یک فایل جداگانه ایجاد کنید (مثلاً /etc/httpd/conf.d/www.my-website.com.conf):

sudo vi /etc/httpd/conf.d/www.my-website.com.conf

محتوای زیر را در فایل جای‌گذاری کنید و my-website.com را با نام دامنه خود جایگزین کنید:

    ServerName www.my-website.com
    Redirect permanent / http://my-website.com/

پس از اتمام، فایل را ذخیره کرده و خارج شوید. اگر این فایل را در /etc/httpd/sites-available ایجاد کرده‌اید (طبق راهنمای نصب Apache)، یک symlink به فایل در /etc/httpd/sites-enabled/ ایجاد کنید:

sudo ln -s /etc/httpd/sites-available/www.my-website.com.conf /etc/httpd/sites-enabled/

این VirtualHost جدید Apache را پیکربندی می‌کند تا یک ریدایرکت 301 به هر کلاینتی که www.my-website.com را درخواست می‌کند ارسال کند و آنها را به my-website.com هدایت کند. این ریدایرکت URI درخواست را حفظ می‌کند، بنابراین درخواستی به http://www.my-website.com/login.php به http://my-website.com/login.php ریدایرکت می‌شود.

توجه: اگر VirtualHost اصلی سایت شما شامل یک ServerAlias با زیردامنه wildcard (*.my-website.com) باشد، بهتر است آن را حذف کنید و برای هر زیردامنه‌ای که می‌خواهید ریدایرکت شود، یک VirtualHost جدید مانند آنچه تازه ایجاد کردید بسازید. اگر نمی‌خواهید همه زیردامنه‌ها ریدایرکت شوند و برخی باید توسط VirtualHost اصلی ارائه شوند، بهتر است هر زیردامنه را به‌صورت صریح به‌عنوان نام مستعار مشخص کنید، به‌ویژه حالا که یک زیردامنه دارید که نمی‌خواهید به‌طور تصادفی با VirtualHost اصلی تطبیق داده شود. (می‌توانید هر زیردامنه را در یک خط ServerAlias جداگانه یا به‌صورت لیستی جدا‌شده با کاما در یک خط ServerAlias مشخص کنید.)

اگر باید ServerAlias برای *.my-website.com را نگه دارید، باید مطمئن شوید که Apache ابتدا VirtualHost جدید www را بارگذاری می‌کند، زیرا اگر VirtualHost اصلی ابتدا بارگذاری شود، Apache از آن برای مدیریت درخواست‌های www.my-website.com استفاده خواهد کرد، چون این نام با نام مستعار wildcard تطبیق دارد. برای بررسی اینکه کدام VirtualHost پس از ری‌استارت Apache ابتدا بارگذاری می‌شود، این دستور را اجرا کنید:

httpd -S

به خطوطی که شامل namevhost my-website.com و namevhost www.my-website.com هستند نگاه کنید. اگر خط www ابتدا ظاهر شود، همه‌چیز آماده است. اگر VirtualHost دامنه اصلی ابتدا ظاهر شود، چند راه برای اطمینان از بارگذاری ابتدا VirtualHost www وجود دارد:

  1. اگر VirtualHost اصلی شما در فایلی (مثلاً /etc/httpd/conf/httpd.conf) است که از دایرکتیو Include یا IncludeOptional برای شامل کردن دایرکتوری حاوی VirtualHost جدید www استفاده می‌کند، خط Include را بالاتر از VirtualHost اصلی در فایل قرار دهید.
  2. اگر VirtualHost اصلی و فایل VirtualHost جدید www در یک دایرکتوری (مثلاً /etc/httpd/conf.d/) قرار دارند، می‌توانید با تغییر نام فایل‌ها و افزودن اعداد به ابتدای نام فایل‌ها، Apache را مجبور به بارگذاری ابتدا www کنید. به نام فایل VirtualHost www پیشوند 01- اضافه کنید (مثلاً /etc/httpd/conf.d/01-www.my-website.com.conf) و به فایل VirtualHost اصلی پیشوند 02- اضافه کنید (مثلاً /etc/httpd/conf.d/02-my-website.com.conf).

دوباره دستور httpd -S را اجرا کنید تا مطمئن شوید VirtualHost www ابتدا ظاهر می‌شود.

وقتی آماده شدید، Apache را ری‌استارت کنید:

sudo systemctl restart httpd

قبل از بازدید از www.my-website.com در مرورگر، با استفاده از curl در سرور یا ماشین محلی خود (اگر curl نصب شده باشد) درخواستی ارسال کنید:

curl -IL http://www.my-website.com

پرچم -I به curl می‌گوید فقط هدرهای پاسخ سرور را نشان دهد. پرچم -L به curl دستور می‌دهد هر ریدایرکتی از سرور را دنبال کند و درخواست دومی به URL داده‌شده در هدر Location ارسال کند (مانند کاری که مرورگر وب انجام می‌دهد). با توجه به اینکه ریدایرکت 301 را پیکربندی کرده‌اید، curl باید دو درخواست انجام دهد و شما باید فقط هدرهای دو پاسخ را ببینید:

HTTP/1.1 301 Moved Permanently
Date: Tue, 03 Jan 2023 19:24:44 GMT
Server: Apache/2.4.53
Location: http://my-website.com/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 200 OK
Date: Tue, 03 Jan 2023 19:24:44 GMT
Server: Apache/2.4.53
Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT
ETag: "39-5eecb7ed6bfc9"
Accept-Ranges: bytes
Content-Length: 57
Content-Type: text/html; charset=UTF-8

در پاسخ 301 (Moved Permanently) به درخواست اولیه به http://www.my-website.com، به هدر دوم از آخر توجه کنید: Location: http://my-website.com. پاسخ دوم از درخواست بعدی curl به URL داده‌شده در هدر Location است، و اگر وب‌سایت شما سالم باشد، سرور باید با 200 (OK) پاسخ دهد.

در نهایت، در مرورگر خود به http://www.my-website.com بروید. اگر چشمک بزنید، ریدایرکت را از دست خواهید داد. وب‌سایت شما باید به‌صورت معمول ظاهر شود، اما دوباره به نوار آدرس نگاه کنید و متوجه شوید که «www» از URL حذف شده است. اکثر کاربران این را متوجه نمی‌شوند و تجربه‌ای مشابه با درخواست http://my-website.com خواهند داشت.

نتیجه‌گیری

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

کنجکاو در مورد ماژول قدرتمندتر mod_rewrite هستید؟ آموزش «چگونه URLها را با mod_rewrite برای Apache در Ubuntu 22.04 بازنویسی کنیم» را بررسی کنید.