
ریدایرکت انتقال کاربر و ربات از یک URL به URL دیگر است. از دید کاربر، تجربهی روانتری ایجاد میکند؛ از دید سئو، مسیر انتقال «سیگنالهای رتبه» (پیجرنک، انکرتکست، تعاملها و تاریخچهی اعتماد) را تعیین میکند. انتخاب نادرست کد یا اجرای شل، معمولاً به «اتلاف سیگنال»، «تأخیر ایندکس»، «Soft 404»، «حلقه/زنجیره» و افت ترافیک منجر میشود. این راهنما صفر تا صد سناریوهای رایج، کدهای درست، پیادهسازی روی وبسرورها و CDN/Edge و چکلیست کنترل کیفی را پوشش میدهد.
Redirect (۳xx): آدرس مقصد به مرورگر/ربات اعلام میشود و Location تغییر میکند. URL نهایی در نوار آدرس عوض میگردد.
Rewrite: در سرور مسیر داخلی عوض میگردد اما URL در نوار آدرس همان میماند. برای سئو زمانی مفید است که URL تمیز نمایش داده شود اما مسیر واقعی فایل/روتینگ متفاوت باشد. «Rewrite» جایگزین «Redirect» نیست؛ اغلب هر دو کنار هم استفاده میشوند.
کاربردها: ادغام محتوا، تغییر دامنه، تغییر http به https، هدایت نسخهی دارای www به نسخهی بدون www (یا برعکس)، یکسانسازی اسلاگها.
نکتهی طلایی: زنجیرهای نکنید؛ A→B مستقیم. هر پرش اضافه = اتلاف سیگنال + کندی خزیدن.
مانند 301 اما متد درخواست (POST/PUT/…) را حفظ میکند. برای API/فرمها یا اپلیکیشنهایی که تغییر متد مشکلساز است. در وبسایتهای محتوایی، 301 غالباً کافی است.
برای تست A/B، کمپین فصلی، جابهجایی کوتاه مدت. پس از پایان، به 200 یا 301 برگردانید. رها کردن 302 طولانی مدت باعث ابهام در سیگنالدهی میشود (هرچند موتورهای مدرن انعطافپذیرتر شدهاند).
نسخهی استانداردتر 302 در سناریوهای فرم/POST. از نظر سئو تفاوت عملی اندک است؛ ثبات در انتخاب مهمتر است.
پس از ارسال فرم، برای هدایت به صفحهی نتیجه با GET (جلوگیری از ارسال مجدد). اثر سئویی مستقیم ندارد، اما در UX و جلوگیری از محتوای تکراری پس از فرم مفید است.
برای حذف واقعی محتوا بدون مقصد جایگزین. به ربات میگوید «این URL برای همیشه رفته». خروج از ایندکس معمولاً سریعتر از 404 رخ میدهد.
نبود موقت/نامشخص. اگر حذف قطعی است، به جای 404 از 410 استفاده کنید. نرخ بالای 404 میتواند «سلامت سایت» را در ذهن موتور جستوجو مخدوش کند.
در سناریوهای حقوقی/قانونی (در صورت لزوم). اثر مستقیمی بر سئو ندارد، اما شفافیت و اطلاعرسانی حقوقی را فراهم میکند.
توجه: 304 Not Modified ریدایرکت نیست؛ پاسخ کشینگ است. در این راهنما پوشش نمیدهیم.
301/308: برای انتقال دائمی سیگنالها معیارند. انتقال کامل همیشه آنی نیست؛ بخشی وابسته به «زمان» و «خزیدن مجدد» است.
302/307: اگر طولانی مدت بمانند، ممکن است موتور جستوجو مقصد را بهعنوان نسخهی اصلی برداشت کند؛ اما برای وضوح معنایی همان ابتدا 301/308 را برای دائمیها انتخاب کنید.
زنجیرهها/حلقهها: هر پرش اضافه ریسک کاهش سیگنال و تأخیر را میافزاید. از A→B→C پرهیز کنید و سریعاً به A→C تبدیل کنید.
Soft 404: اگر URL به صفحهی نامرتبط/کمارزش هدایت شود یا صفحهی مقصد محتوایی همارزش نداشته باشد، ممکن است بهصورت Soft 404 شناسایی گردد. مقصد باید «منطقی و مرتبط» با منبع باشد.
Redirect زمانیکه نسخهی قدیمی را واقعاً کنار گذاشتهاید یا کاربر نباید آن را ببیند.
Canonical زمانیکه نسخههای مشابه میخواهید در دسترس باشند اما یکی را بهعنوان مرجع به موتور معرفی میکنید (مثل پارامترهای UTM یا مرتبسازی).
اگر پارامترها را نشان نمیدهید یا صفحهی مستقل نیست، بهتر است 301 به نسخهی تمیز بدهید.
Apache (.htaccess):
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Nginx:
server { listen 80; return 301 https://$host$request_uri; }
نکات: ابتدا همهچیز را با 200 روی HTTPS سالم کنید (گواهی، منابع و HSTS). سپس 301 را فعال نمایید. حتماً پس از اطمینان، HSTS را تنظیم کنید (و در صورت آمادگی، Preload).
Apache (هدایت به نسخهی بدون www):
RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
Nginx (هدایت به بدون www):
server { listen 80; server_name www.example.com; return 301 https://example.com$request_uri; }
نکات: یک مقصد انتخاب کنید و همهچیز را به آن مستقیم هدایت کنید (نه http→https→بدون www در دو پرش؛ یک پرش کافی است).
Trailing Slash (افزودن اسلش پایانی برای مسیرها):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !/$ RewriteRule ^(.+)$ /$1/ [R=301,L]
Lowercase (به حروف کوچک؛ احتیاط کنید، ممکن است با مسیرهای حساس به حروف مشکل ایجاد کند):
RewriteMap tolower int:tolower RewriteCond %{REQUEST_URI} [A-Z] RewriteRule (.*) ${tolower:$1} [R=301,L]
حذف فایل index از انتهای آدرس URL (مانند index.html یا index.php):
RewriteCond %{THE_REQUEST} \s/+(.*/)?index\.(html|php)\s [NC] RewriteRule ^ %1 [R=301,L]
Nginx – حذف index.html:
location = /index.html { return 301 /; }
Apache – مسیر قدیمی → جدید:
Redirect 301 /blog/old-article /blog/new-article
انجیناکس یا Nginx:
location = /blog/old-article { return 301 /blog/new-article; }
نکات:
برای مجموعهای بزرگ، از Redirect Map استفاده کنید (سرعت و نگهداری بهتر).
مقصد باید «مرتبطترین» صفحه باشد تا Soft 404 نشود.
اگر صفحات پارامتردار را نمایش میدهید، از rel=canonical به نسخهی تمیز استفاده کنید.
اگر نمایش نمیدهید، 301 به نسخهی تمیز بدهید و پارامترها را نگه دارید یا حذف کنید بسته به نیاز آنالیتیکس.
Apache – هدایت به نسخهی تمیز بدون UTM:
RewriteCond %{QUERY_STRING} (^|&)utm_(source|medium|campaign|term|content)= [NC] RewriteRule ^ %{REQUEST_URI}? [R=301,L]
Nginx – حذف UTM:
if ($args ~* "(^|&)utm_(source|medium|campaign|term|content)=") { return 301 $uri; }
دامنه A → دامنه B: 301 سراسری، نقشهی 1:1، بهروزرسانی سایتمپ، اعلام Change of Address در کنسول جستوجو.
سابدامنه → زیرپوشه (blog.example.com → example.com/blog/): 301 با حفظ مسیرها.
زیرپوشه → سابدامنه: مشابه، اما دقت به لینکهای داخلی/منوها و سیاستهای CDN.
Apache – مهاجرت دامنه:
RewriteEngine On RewriteCond %{HTTP_HOST} ^old-domain\.com$ [NC] RewriteRule ^ https://new-domain.com%{REQUEST_URI} [R=301,L]
از تشخیص IP/Geo برای تغییر خودکار زبان/کشور پرهیز کنید؛ باعث ایندکسپذیری ناقص و تجربهی بد ربات میشود. به جای آن، بنر/سوییچر زبان + hreflang.
برای AMP یا نسخهی موبایل جدا، تا حد امکان Responsive را ترجیح دهید. اگر مجبور به ریدایرکت هستید، از Vary: User-Agent و مقصد معادل دقیق استفاده کنید و لینکهای alternate/amphtml را رعایت کنید.
برای جلوگیری از ارسال مجدد فرم: 303 به صفحهی نتیجه (GET).
برای حفظ متد و دادهها هنگام جابهجایی موقت: 307.
# فعالسازی RewriteEngine On # 301: http → https + بدون www در یک پرش RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L] # 301: مسیر قدیمی → جدید Redirect 301 /old-path /new-path # 302: انتقال موقت Redirect 302 /promo /promo-summer # 410: حذف دائمی Redirect gone /old-deleted-url
# 301: http → https server { listen 80; return 301 https://$host$request_uri; } # 301: www → بدون www server { listen 443 ssl; server_name www.example.com; return 301 https://example.com$request_uri; } # 301: مسیر قدیمی → جدید location = /old-path { return 301 /new-path; } # 410: حذف دائمی location = /old-deleted-url { return 410; }
const express = require('express'); const app = express(); // 301: دامنه قدیمی → جدید app.use((req, res, next) => { if (req.headers.host === 'old-domain.com') { return res.redirect(301, 'https://new-domain.com' + req.originalUrl); } next(); }); // 302: موقت app.get('/promo', (req, res) => res.redirect(302, '/promo-summer')); app.listen(3000);
// 301: مسیر قدیمی → جدید header("Location: /new-path", true, 301); exit;
پلاگین Redirection برای مدیریت انبوه ریدایرکتها + گزارش خطاها.
functions.php (احتیاطی و سبک):
add_action('template_redirect', function () { if (is_page('old-page')) { wp_redirect(home_url('/new-page/'), 301); exit; } });
next.config.js:
module.exports = { redirects: async () => [ { source: '/old-path', destination: '/new-path', permanent: true }, { source: '/promo', destination: '/promo-summer', permanent: false } ], };
فایل _redirects:
/old-path /new-path 301 /promo /promo-summer 302
Redirect Rules یا Page Rules برای الگوهای ساده.
Workers برای منطق پیچیده:
export default { async fetch(req) { const url = new URL(req.url); if (url.hostname === 'old-domain.com') { url.hostname = 'new-domain.com'; return Response.redirect(url.toString(), 301); } return fetch(req); } }
در S3 میتوانید برای آبجکتها «Redirect» تعریف کنید.
در CloudFront با Function/Behavior مسیرها را هدایت کنید. برای مهاجرتهای بزرگ، Lambda@Edge انعطاف بیشتری میدهد.
<configuration> <system.webServer> <rewrite> <rules> <rule name="HTTP to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
Open Redirect: هرگز مقصد را مستقیم از پارامتر کاربر (مثلاً ?next=) بدون سفیدلیست معتبر نگیرید. حملات فیشینگ/SEO Spam رایجاند.
HSTS: پس از اطمینان از سلامت https و ریدایرکتها، HSTS را فعال کنید تا مرورگرها همیشه https را ترجیح دهند.
Expose نشدن منطق داخلی: پیامهای خطا/لوگهای ریدایرکت را در محیط تولید منتشر نکنید.
یک پرش به مقصد نهایی (نه چند پرش).
Redirect Map برای فهرستهای بزرگ (Apache/Nginx) → سریعتر از دهها Rule پراکنده.
کشینگ: مرورگر و CDN میتوانند ریدایرکتهای دائمی را کش کنند. پس از اشتباه 301، برگشت سخت میشود؛ ابتدا در محیط Stage تست کنید.
مانیتورینگ زنده: رصد نرخ 3xx/4xx/5xx در لاگها. افزایش ناگهانی 302/404 هشدار است.
نقشهی URL→URL را کامل کنید (CSV/Sheet با ستونهای Source/Destination/Status).
مقصدها را از نظر محتوایی مرتبط و معادل بسازید (کاهش Soft 404).
ریدایرکتها را در محیط Stage تست کنید (Crawl + Bench).
http→https + www/بدون www را در یک پرش نهایی کنید.
زنجیرهها/حلقهها را حذف کنید (Screaming Frog/سایر ابزارها).
SiteMap جدید بسازید و قدیمیها را حذف/بهروز کنید.
لینکهای داخلی/ناوبری را به مقصد نهایی بهروزرسانی کنید (اتکاء صرف به ریدایرکت بد است).
کنسول جستوجو: Change of Address (برای دامنه)، رصد Coverage/Redirect Errors.
Log Analysis: الگوهای غیرمنتظرهی 404/410/302 را شناسایی و اصلاح کنید.
پس از تثبیت، HSTS/Preload را فعال کنید (در صورت آمادگی کامل).
کرل یا curl:
curl -I https://example.com/old-path # Location و کد وضعیت را بررسی کنید
Screaming Frog / Sitebulb: لیست کامل 3xx/4xx/5xx، عمق پرش، تشخیص حلقه/زنجیره.
کروم DevTools: تب Network → فیلتر 3xx.
لایتهاوس/وبوایتالز: مطمئن شوید ریدایرکتهای غیرضروری سرعت را نمیکاهد.
لاگهای سرور/CDN: رصد الگوهای غیرعادی.
Meta Refresh/JavaScript Redirect به جای 3xx: از نظر سئو ضعیف و شکنندهاند؛ فقط در مواقع کاملاً اضطراری.
هدایت به صفحهی غیرمرتبط: سیگنال از بین میرود و Soft 404 میگیرید. مقصد را مرتبطترین انتخاب کنید.
302 طولانی مدت برای تغییر دائمی: پس از تأیید، به 301/308 تغییر دهید.
فراموشی بهروزرسانی لینکهای داخلی: بار غیرضروری روی ریدایرکت و خزنده ایجاد میکند.
حساسیت به حروف: روی سرورهایی که Case-Sensitive هستند، قوانین Lowercase را آگاهانه اعمال کنید.
ریدایرکتهای شرطی Geo/User-Agent بدون سوییچر زبان/دسترسی مستقیم: ایندکس ناقص و تجربهی بد ربات. از hreflang + سوییچر استفاده نمایید.
تغییر دائمی URL یا دامنه → 301 یا 308 (308 برای حفظ متد؛ در محتوایی معمولاً 301)
تبدیل http به https → 301 (همراه با HSTS پس از تثبیت)
تغییر www به بدون www یا برعکس → 301 (در یک پرش، سراسری)
تست یا کمپین کوتاهمدت → 302 یا 307 (307 اگر حفظ متد لازم است)
حذف واقعی بدون جایگزین → 410 (خروج سریعتر از ایندکس)
نمایش نتیجهی فرم → 303 (ریدایرکت به GET)
پارامترهای ردیابی (UTM و …) → Canonical یا 301 (بسته به نمایش یا عدمنمایش)

httpd.conf یا vhost:
RewriteMap redirects txt:/path/to/redirects.map RewriteEngine On RewriteCond ${redirects:%{REQUEST_URI}} !="" RewriteRule ^ ${redirects:%{REQUEST_URI}} [R=301,L]
نمونه فایل redirects.map:
/old-a /new-a /old-b /new-b /blog/2021/slug /blog/slug
map $request_uri $target_uri { /old-a /new-a; /old-b /new-b; /blog/2021/slug /blog/slug; default ""; } server { listen 443 ssl; if ($target_uri != "") { return 301 $target_uri; } }
مزایا: مدیریت متمرکز، سرعت، مقیاسپذیری و خوانایی.
برای هر URL قدیمی، بهترین معادل را پیدا کنید:
اگر مقالهی «راهنمای خرید 2022» حذف شده و نسخهی 2025 دارید، به نسخهی 2025 هدایت کنید (نه دستهی کلی یا صفحهی اصلی).
صفحات فهرست/تگها را تا حد ممکن به فهرست/تگ معادل ببرید.
اگر معادل واقعی برای صفحه وجود ندارد و آن صفحه ارزش جستوجویی ندارد، با کد 410 آن را حذف کنید تا سریعتر از ایندکس خارج شود.
پرشهای متعدد، شروع رندر و TTFB را بدتر میکند.
مقصد را بهینه کنید؛ First Byte پایین، کَشینگ درست، CDN نزدیک.
برای منابع استاتیک (CSS/JS/تصویر) از ریدایرکت پرهیز کنید؛ URL صحیح را در HTML قرار دهید.
در سایتهای بزرگ، مالکیت ریدایرکت را مشخص کنید: SEO + Backend + DevOps.
فرآیند Pull Request برای قوانین جدید؛ تست خودکار (Integration Tests) برای جلوگیری از حلقه و زنجیره.
داشبورد هفتگی: نرخ 3xx/4xx/5xx، برترین منابع 404، لینکهای داخلی معیوب.
کد 301 ستون اصلی کاننیکالسازی ساختار URL است و باید برای انتقالهای دائمی مانند http به https، تغییر دامنه، تغییر بین نسخه دارای www و بدون www و همچنین یکسانسازی اسلاگها استفاده شود. کدهای 308، 307 و 303 را بسته به نیاز به حفظ متد یا فرم به کار بگیرید و برای حذف واقعی صفحات و پاکسازی ایندکس از 410 استفاده کنید.
مقصد هر ریدایرکت باید بیشترین ارتباط و همارز بودن را با صفحه اصلی داشته باشد و از ایجاد زنجیره یا حلقه جلوگیری شود. اجرای صحیح با استفاده از Redirect Map، تست در محیط Stage، خزیدن دورهای، مانیتورینگ لاگ و بهروزرسانی لینکهای داخلی انجام میگردد. پس از تثبیت کامل HTTPS و ساختار ریدایرکتها، فعالسازی HSTS و در صورت آمادگی، Preload توصیه میشود.
آیا 302 هم سیگنال منتقل میکند؟
موتورهای مدرن در صورت طولانیشدن 302 ممکن است مقصد را اصلی فرض کنند، اما برای شفافیت و آیندهنگری، برای تغییرات دائمی 301/308 بدهید.
301 برگردانده شد اما ترافیک افت کرد؛ طبیعی است؟
در مهاجرتهای بزرگ، نوسان کوتاه مدت طبیعی است. نقشهی 1:1، حذف زنجیره، مقصد مرتبط و لاگمحور بودن، زمان بازیابی را کوتاه میکند.
برای دستهای از URLهای پارامتردار چه کنم؟
اگر قابلنمایشاند، Canonical روی نسخهی تمیز. اگر نیستند، 301 به مسیر تمیز و حذف پارامتر.
410 بهتر است یا 404؟
برای حذف واقعی، 410 شفافتر و در خروج از ایندکس سریعتر است. برای نبود موقت/نامشخص، 404.
301 یا 308؟
اگر حفظ متد مهم نیست (اغلب محتوایی)، 301 ساده و کافی است. برای API/فرمها که تغییر متد مشکلساز است، 308.
تهیه شده توسط تیم تخصصی سئو سید احسان خسروی (مدیر، متخصص و مشاور استراتژیک سئو)