إنشاء قواعد إعادة توجيه .htaccess للرمزين 301 و302
حوّل قائمة التحويلات إلى قواعد Apache جاهزة للصق من دون كتابة تعبيرات نمطية يدوياً.
شغّل الأداة مجانًا
أدخل كل مسار قديم ووجهته، واختر استجابة 301 الدائمة أو 302 المؤقتة، لتحصل على أسطر RewriteRule دقيقة وكتلة .htaccess مجمعة. يعالج المولّد الرموز الخاصة في مسارات المصدر بأمان، ويدعم الوجهات المحلية وعناوين HTTP أو HTTPS المطلقة، ويحافظ على الترتيب الذي أدخلته، ويبلغ عن الأزواج الناقصة قبل أن تتحول إلى عمليات إعادة توجيه معطلة.
أعدّ قائمة واضحة لعمليات إعادة التوجيه
ابدأ بصف واحد لكل عنوان تريد نقله. تتطلب أداة إنشاء قواعد إعادة توجيه .htaccess مسار المصدر في حقل from والوجهة في حقل to. يجب أن يكون المصدر مساراً نسبياً إلى الجذر يبدأ بشرطة مائلة، مثل /old-products/widget. لا تضع سلسلة استعلام أو جزءاً مرجعياً في المصدر، لأن RewriteRule في Apache يطابق مسار URL ولا يطابق هذين المكوّنين. يمكن أن تكون الوجهة مساراً آخر نسبياً إلى جذر الموقع نفسه، أو عنوان HTTP أو HTTPS كاملاً عندما ينبغي نقل الزائر إلى مضيف آخر. استخدم ترميز النسبة المئوية للأحرف التي تتطلبه بدلاً من المسافات الحرفية. احتفظ بالصفوف وفق الترتيب الذي تريد أن يقيّمها Apache به. ورغم أن القواعد الناتجة تطابق المسار كاملاً فتتفادى كثيراً من التعارضات، فإن الترتيب المقصود يسهّل المراجعة والصيانة والمقارنة مع جدول الترحيل. يتحقق المولّد من كل صف، وإذا غاب from أو to تتوقف العملية مع تحديد الزوج غير المكتمل.
اختر السلوك الدائم أو المؤقت
اختر 301 عندما يكون النقل دائماً وينبغي لمحركات البحث والمتصفحات والأنظمة اللاحقة اعتماد العنوان البديل. واختر 302 عندما يكون التغيير مؤقتاً، مثل مدة حملة قصيرة أو نافذة صيانة أو اختبار مضبوط. تنطبق الحالة المختارة بصورة موحدة على جميع الأزواج في الطلب الواحد، وبذلك لا ينتج جدول مختلط سلوكاً مختلفاً عن المتوقع من دون تنبيه. يستخدم كل سطر ناتج نمط مصدر مثبتاً، ووجهة تم التحقق منها، وعلامات Apache بالصيغة R=301,L أو R=302,L. تجعل علامات التثبيت المطابقة خاصة بالمسار الكامل بدلاً من جزء واسع منه، بينما توقف L جولة إعادة الكتابة الحالية بعد نجاح القاعدة. كذلك يفلت المولّد علامات الترقيم ذات المعنى في التعبيرات النمطية، فلا تطابق النقطة أو الأقواس الحرفية عناوين أخرى عن طريق الخطأ. تحقق من أن الخادم يقرأ ملفات .htaccess وأن mod_rewrite مفعّل؛ فهذه الأداة تنشئ التوجيهات، لكنها لا تستطيع فحص تثبيت Apache أو تغييره.
ثبّت الكتلة الناتجة وتحقق منها
انسخ قيمة htaccess إلى ملف .htaccess المناسب ضمن نطاق الموقع الذي يعالج مسارات المصدر. لا تحتوي النتيجة إلا على أسطر RewriteRule، ولذلك قد يتضمن الإعداد الحالي RewriteEngine On بالفعل؛ أضف هذا التوجيه منفصلاً إذا لم تكن إعادة الكتابة مفعلة في الملف. احتفظ بنسخة احتياطية من الإعداد الحالي قبل تعديله، واختبره في بيئة مرحلية متى أمكن. اطلب كل URL قديم وتحقق من حالة الاستجابة وترويسة Location والصفحة النهائية وعدم وجود سلسلة تحويل غير متوقعة. اختبر أيضاً عنواناً قريباً لا ينبغي تحويله، لأن الاختبارات السلبية تكشف تفاعلات في الإعداد لا يظهرها نجاح الوصول إلى الوجهة. قد تتأثر قواعد Apache المحلية بالتوجيهات السابقة أو اللاحقة، وإعدادات المضيف الافتراضي، وطبقات الوكيل، وقواعد إعادة الكتابة في نظام إدارة المحتوى. لأغراض الأتمتة، تعيد API مصفوفة من القواعد المنفردة وكتلة موصولة بفواصل أسطر. تبلغ تكلفة الطلب الواحد $0.002؛ كما يعمل المولّد الحتمي نفسه في المتصفح لعمليات الترحيل الفردية.
حالات الاستخدام
إطلاق موقع أُعيد تصميمه
حوّل خريطة المسارات القديمة والجديدة المعتمدة إلى توجيهات دائمة دقيقة قبل نشر بنية المعلومات الجديدة.
تشغيل حملة مؤقتة
أنشئ قواعد 302 متسقة للنقل القصير لصفحات الهبوط التي لا ينبغي اعتمادها بدائل دائمة.
نقل صفحات محددة إلى نطاق آخر
أنشئ قواعد ذات وجهات HTTPS مطلقة مع إبقاء كل مسار مصدر صريحاً وسهل المراجعة.
الأسئلة الشائعة
ما التكلفة؟
تبلغ تكلفة طلب API الواحد $0.002. ويمكنك أيضاً تشغيل المولّد في المتصفح من هذه الصفحة.
هل تتضمن النتيجة RewriteEngine On؟
لا. تتضمن النتيجة أسطر RewriteRule فقط، لأن كثيراً من ملفات .htaccess الحالية تفعّل محرك إعادة الكتابة مسبقاً.
هل يمكن خلط تحويلات 301 و302 في طلب واحد؟
لا. ينطبق النوع المختار على جميع الأزواج في الطلب. استخدم طلبات منفصلة عندما يلزم فصل القواعد الدائمة عن المؤقتة.
هل يمكن أن تشير الوجهة إلى نطاق آخر؟
نعم. يمكن أن تكون عنوان HTTP أو HTTPS مطلقاً بلا بيانات اعتماد مضمّنة، أو مساراً نسبياً إلى جذر الموقع الحالي.
ماذا يحدث إذا كان أحد الأزواج غير مكتمل؟
تتوقف العملية بخطأ إدخال غير صالح يحدد الزوج ويبيّن ما إذا كان الحقل from أو to هو المفقود.
هل تُقبل سلاسل الاستعلام في مسارات المصدر؟
لا. يطابق RewriteRule المسارات لا سلاسل الاستعلام؛ وتتطلب مطابقتها توجيهات RewriteCond إضافية خارج نطاق هذا المولّد.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/web/htaccess-redirect-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}'const res = await fetch("https://api.kit.forhosting.com/web/htaccess-redirect-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/htaccess-redirect-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/htaccess-redirect-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/htaccess-redirect-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.htaccess_redirect_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_items | 500 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |