سؤال

إطلاق موقع جديد لعميل جديد.يحتوي موقعهم القديم على حوالي 50 منتجًا، ولسوء الحظ، لا تتطابق أسماء المنتجات القديمة مع نمط عنوان URL الجديد

أمثلة على عناوين URL القديمة:

example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription

example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123

example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers

(تصل عناوين URL القديمة أحيانًا إلى أكثر من 150 حرفًا.)

عناوين URL الجديدة:

example.com/products/category/actual-product-name

لا يوجد نمط محدد يمكن التعرف عليه للانتقال من اسم المنتج القديم إلى الاسم الجديد.هناك للفئة.

لقد قمت بتجربة عمليات إعادة توجيه mod_alias بسيطة، ولكنني أفهم أنني بحاجة إلى RewriteRule بدلاً من ذلك.ولكن لدي مشاكل.كل ما أحتاجه هو إعادة توجيه 1 إلى 1 لكل عنوان من عناوين URL الخمسين هذه.اعتقدت أنه يمكنني فعل شيء مثل:

RewriteRule ^/products.aspx?category=Foo&product=ProductName
    /products/category/new-product-name/  [R=301,NC]

ولكن هذا لا يعمل.أعلم أن هذا يجب أن يكون بسيطًا، لكنني عالق.أيه أفكار؟

هل كانت مفيدة؟

المحلول

استخدم النموذج أدناه لبقية عناوين URL الخاصة بإعادة التوجيه.لاحظ أنك تهرب من الأحرف الخاصة على سبيل المثال. ? , . والفضاء بإضافة أ \ أمامهم

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/  [R=301,NC]

نصائح أخرى

الق نظرة على RewriteMap توجيه mod_rewrite.

يمكنك تحديد شيء مثل هذا في ملف نصي:

products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name

وفي الخاص بك httpd.conf

RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]

نصيحة:إذا كنت تريد إعادة توجيه دائمة، فتأكد من تعيين خيار مناسب Cache-Control و Expires رأس لتوجيه المتصفحات للتخزين المؤقت لملف 301.

يمكنك تجربة شيء مثل هذا:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$

RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]

ملحوظات:

  1. في سياق per-dir (.htaccess)، يتم تجريد البادئة per-dir، لذا لا يمكنك بدء تشغيل RewriteRule نمط مع ^/.

  2. عليك أن تستخدم RewriteCond لتتناسب مع سلسلة الاستعلام.

  3. كما جاء في إجابة أخرى ، أ RewriteMap قد يكون الحل مناسبًا لهذا الموقف، إذا كان لديك حق الوصول إلى httpd.conf / تعريف vhost لهذا الموقع.لست متأكدًا من كيفية عمل ذلك مع سلاسل الاستعلام.

  4. بالنسبة لشيء مثل هذا، قد يكون الحل الأفضل هو إعادة كتابة كل عناوين URL هذه إلى برنامج نصي من جانب الخادم، واستخدام البرنامج النصي لإجراء إعادة توجيه HTTP لكل عنوان URL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top