إعادة توجيه عنوان URL غير www إلى www باستخدام htaccess

StackOverflow https://stackoverflow.com/questions/50931

  •  09-06-2019
  •  | 
  •  

سؤال

أنا استخدم إعادة كتابة ISAPI من شركة Helicon 3, ، والذي يمكّن بشكل أساسي .htaccess في IIS.أحتاج إلى إعادة توجيه عنوان URL غير www إلى إصدار www، أي.يجب على example.com إعادة التوجيه إلى www.example.com.لقد استخدمت القاعدة التالية من الأمثلة ولكنها تؤثر على النطاقات الفرعية:

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

يعمل هذا في معظم الأحيان، ولكنه أيضًا يعيد توجيه sub.example.com إلى www.sub.example.com.كيف يمكنني إعادة كتابة القاعدة المذكورة أعلاه حتى لا تتم إعادة توجيه النطاقات الفرعية؟

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

المحلول

قم بإلحاق RewriteCond التالي:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

بهذه الطريقة سيتم تطبيق القاعدة فقط على Nondottedsomething.uptofiveletters كما ترون، subdomain.domain.com لن يتطابق مع الشرط وبالتالي لن تتم إعادة كتابته.

يمكنك تغيير [a-z]{2,5} للحصول على تعبير عادي أكثر صرامة لمطابقة نطاق المستوى الأعلى، بالإضافة إلى وضع جميع القيود على الأحرف المسموح بها في أسماء النطاقات (حيث أن [^.]+ أكثر تساهلاً من الضرورة القصوى).

بشكل عام، أعتقد أن ذلك لن يكون ضروريًا في هذه الحالة.

يحرر:رصدت سادي خللًا في التعبير العادي، وغيرت الجزء الأول منه من [^.] إلى [^.]+

نصائح أخرى

لقد حصلت على مزيد من التحكم باستخدام urlrewriter.net, ، شيء مثل:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>

لدى Zigdon الفكرة الصحيحة باستثناء أن تعبيره العادي ليس صحيحًا تمامًا.يستخدم

^example\.com$

بدلاً من اقتراحه بـ:

^example\.com(.*)

وإلا فلن تقوم فقط بمطابقة example.com، بل ستطابق أشياء مثل example.comcast.net، وexample.com.au، وما إلى ذلك.

@فينكو

بالنسبة لنهجك العام، لست متأكدًا من سبب اختيارك للحد من طول TLD في التعبير العادي الخاص بك؟إنها ليست مقاومة للمستقبل، ولست متأكدًا من الفائدة التي تقدمها؟إنه في الواقع ليس "مثبتًا الآن" نظرًا لوجود TLD واحد على الأقل مكون من 6 أحرف (.museum) والذي لن تتم مطابقته.

يبدو أنه من غير الضروري بالنسبة لي أن أفعل هذا.لا يمكنك أن تفعل ذلك فقط ^[^.]+\.[^.]\+$؟(ملحوظة:علامة الاستفهام هي جزء من الجملة، وليس التعبير العادي!)

وبغض النظر عن كل ذلك، هناك مشكلة أكبر في هذا النهج وهي:وسوف يفشل بالنسبة للنطاقات التي لا تقع مباشرة ضمن TLD.هذه النطاقات موجودة في أستراليا والمملكة المتحدة واليابان والعديد من البلدان الأخرى، والتي لديها تسلسلات هرمية:.co.jp، .co.uk، .com.au، وما إلى ذلك.

لا أعرف ما إذا كان هذا يثير قلق OP أم لا، ولكن هذا شيء يجب أن تكون على دراية به إذا كنت تبحث عن إجابة "إصلاح الكل".

لم يوضح OP بعد ما إذا كان يريد حلاً عامًا أو حلاً لمجموعة واحدة (أو مجموعة صغيرة) من المجالات المعروفة.إذا كان هذا الأخير، راجع ملاحظتي الأخرى حول استخدام نهج زيجدون.إذا كان الأمر الأول، فاستمر في اتباع نهج Vinko مع مراعاة المعلومات الواردة في هذا المنشور.

يحرر:هناك شيء واحد تركته حتى الآن، والذي قد يكون أو لا يكون خيارًا بالنسبة لك من الناحية التجارية، وهو السير في الاتجاه الآخر.جميع مواقعنا تعيد التوجيه http://www.domain.com ل http://domain.com.أهل عند http://no-www.org تقديم حالة جيدة جدًا (IMHO) لأن هذه هي الطريقة "الصحيحة" للقيام بذلك، لكنها لا تزال بالتأكيد مجرد مسألة تفضيل.هناك شيء واحد مؤكد، وهو أنه من الأسهل بكثير كتابة قاعدة عامة لهذا النوع من إعادة التوجيه من هذه القاعدة.

@org 0100h نعم، هناك العديد من المتغيرات التي لم يتم ذكرها في وصف المشكلة، وجميع نقاطك صحيحة ويجب معالجتها في حالة التنفيذ الفعلي.هناك إيجابيات وسلبيات للتعبير العادي المقترح.من ناحية، يعد هذا إثباتًا أسهل ومستقبليًا، ومن ناحية أخرى، هل تريد حقًا مطابقة example.foobar إذا تم إرساله في رأس المضيف؟قد تكون هناك بعض حالات الحافة عندما ينتهي بك الأمر بإعادة التوجيه إلى النطاق الخطأ.البديل الثالث هو تعديل التعبير العادي لاستخدام قائمة النطاقات الفعلية، إذا كان هناك أكثر من نطاق واحد، مثل

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(ملاحظة لكريس، ذلك الشخص سوف تغيير %1)

@ chrisofspades ليس المقصود استبداله، فحالتك رقم اثنين تضمن أنه لا يحتوي على www، في حين أن حالتي لا تحتوي عليه.لن يغير قيم %1، %2، %3 لأنه لا يخزن المطابقات (iow، فهو لا يستخدم الأقواس).

ألا يمكنك ضبط RewriteCond ليعمل فقط على example.com؟

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]

لماذا لا يوجد لديك شيء مثل هذا في ملف vhost (من httpd) الخاص بك؟

ServerName: www.example.com
ServerAlias: example.com

بالطبع لن يتم إعادة التوجيه، بل سيستمر الأمر كالمعتاد

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