سؤال

لدي موقع إلكتروني لا يبدو أنه يعيد توجيه من غير www إلى شبكة الاتصالات العالمية.

تكوين Apache الخاص بي هو كما يلي:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

ماذا ينقصني؟

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

المحلول

استخدام محرك إعادة الكتابة هو وسيلة ثقيلة جدا لحل هذه المشكلة. هنا هو الحل الأكثر بساطة:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

ثم سيكون لديك آخر <VirtualHost> القسم مع ServerName www.example.com لتكوين الخادم الحقيقي الخاص بك. Apache يحفظ تلقائيا أي شيء بعد / عند استخدام Redirect التوجيه, ، وهو فكرة خاطئة شائعة حول سبب عمل هذه الطريقة (عندما تفعل ذلك في الواقع).

نصائح أخرى

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

لازالة www منك URL موقع استخدام هذا الرمز في .htaccess ملف:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1$1 [R=301,L]

لأجبار www في موقع الويب الخاص بك URL استخدم هذا الرمز .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

أين YourSite.com يجب استبداله ب URL.

    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

هذا ما يحدث مع الكود أعلاه. أول فحص كتلة المضيف الافتراضية إذا كان الطلب هو www.example.com ويعمل موقع الويب الخاص بك في هذا الدليل.

الفشل الذي، يتعلق الأمر بالقسم المضيف الظاهري الثاني. هنا يتم إعادة توجيه أي شيء آخر غير www.example.com إلى www.example.com.

الأمر هنا يهم. إذا قمت بإضافة توجيه VirtualHost الثاني أولا، فسيؤدي ذلك إلى حلقة إعادة التوجيه.

سيؤدي هذا الحل إلى إعادة توجيه أي طلب إلى مجالك، إلى www.yourdomain.com.

هتافات!

هذا يشبه العديد من الاقتراحات الأخرى مع تحسينات الزوجين:

  • لا حاجة إلى تشغيل المجال (يعمل مع Vhosts التي تقبل مجالات متعددة أو بين البيئات)
  • يحافظ على المخطط (HTTP / HTTPS) ويتجاهل آثار السابقة %{REQUEST_URI} قواعد.
  • جزء المسار غير متأثر به السابق RewriteRules مثل %{REQUEST_URI} يكون.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

هذا يبدأ مع HTTP_HOST متغير، الذي يحتوي على جزء اسم المجال فقط من عنوان URL الوارد (example.com). على افتراض اسم المجال لا يحتوي على www. ويطابق اسم المجال الخاص بك بالضبط، ثم يأتي إعادة التشغيل في اللعب. النمط ^(.*)$ سوف تطابق كل شيء في REQUEST_URI, ، وهذا هو المورد المطلوب في طلب HTTP (foo/blah/index.html). يخزن هذا في مرجع مرفوع، ثم يستخدم بعد ذلك لإعادة كتابة عنوان URL باسم المجال الجديد (واحد يبدأ www).

[NC] يشير إلى مطابقة نمط غير حساس، [R=301] يشير إلى إعادة توجيه خارجي باستخدام رمز 301 (تم نقل المورد بشكل دائم)، و [L] توقف جميع إعادة كتابة مزيد من التعديل، ويعيد توجيهات على الفور.

ركضت هذا ...

 RewriteEngine on
 RewriteCond %{HTTP_HOST} !^www.*$ [NC]
 RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

أحتاج إلى أن يكون هذا عالميا مقابل 25 نطاقات على الخادم الجديد لدينا، بحيث يكون هذا التوجيه في ملف Virtual.conf الخاص بي فيu003CDirectory> بطاقة شعار. (دير هو الوالد لجميع الأطباء)

اضطررت إلى القيام قليلا من الاختراق على قاعدة إعادة الكتابة على الرغم من أن docroot الكامل تم نقله في مباراة النمط، على الرغم من ما http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html. يقول عن ذلك فقط كونه أشياء بعد المضيف والمنفذ.

رمز إعادة توجيه لكلا غير www => شبكة الاتصالات العالمية وعكس www => non-www. لا مجالات صلابة ومخططات في ملف .htaccess. سيتم الحفاظ على نطاق الأصل ونسخة HTTP / HTTPS.

اباتشي 2.4 والأحدث

غير www => www:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

www => غير www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]

ملاحظة: لا تعمل على Apache 2.2 حيث لا يتوفر٪ {reder_scheme}. للحصول على التوافق مع Apache 2.2 استخدم الرمز أدناه أو استبدال٪ {reder_scheme} مع ثابت http / htttps.


Apache 2.2 والأحدث

غير www => www:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... أو نسخة أقصر ...

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

www => غير www:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

... إصدار أقصر غير ممكن لأن٪ n متاح فقط من آخر عملية ReWriteCond ...

إذا كنت تستخدم Apache 2.4، دون الحاجة إلى تمكين وحدة OPACHE لإعادة كتابة وحدة Apache، يمكنك استخدام شيء مثل هذا:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

إعادة توجيه domain.tld إلى شبكة الاتصالات العالمية.

يمكن إضافة الأسطر التالية إما في توجيهات Apache أو في ملف .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • لا تزال الأحكام الأخرى تعمل.
  • لا حاجة لضبط الخطوط. مجرد نسخ / لصقها في المكان المناسب.

لا تنس تطبيق تغييرات Apache إذا قمت بتعديل vhost.

(بناء على drupal7 الافتراضي .htaccess ولكن يجب أن تعمل في كثير من الحالات)

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

سيؤدي ذلك إلى إعادة توجيه اسم المجال فقط ولكن أيضا الصفحات الداخلية. مثل ...

alex/abcd.html.==>www.example.com/abcd.html.
examplete.com/ab/cd.html؟ef=GH.==> www.example.com/ab/cd.html؟ef=GH.

جرب هذا:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]

هذا بسيط!

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteEngine On RewriteCond %{HTTP_HOST} ^yourdomain.com [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]

تحقق هذا العمل المثالي

لا تستخدم دائما Redirect permanent (أو لماذا قد يسبب مشاكل)

إذا كانت هناك فرصة ستضيفها في وقت لاحق، فلا تستخدم redirect permanent.

لأنه إذا استخدم العميل من المجال الفرعي الذي لم يسجل VirtualHost قد لا يصل أيضا إلى هذا المجال الفرعي حتى عند تسجيله لاحقا.

redirect permanent يرسل HTTP 301 Moved Permanently إلى العميل (المتصفح) والكثير منهم ذاكرة التخزين المؤقت هذه الاستجابة للأبد (حتى يتم مسح ذاكرة التخزين المؤقت [يدويا]). لذا فإن استخدام هذا المجال الفرعي سيؤدي دائما إلى www. *** دون طلب الخادم مرة أخرى.

يرى كم من الوقت هل ذاكرة التخزين المؤقت للمتصفحات http 3001s؟

لذلك فقط استخدم Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - عند عدم استخدام MOD_REWRITE

Apache.org - HostNames Canonical

لدي فقط مشكلة نفسها. ولكن حل مع هذا

RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

هذه القاعدة تعيد توجيه عدم الاتصال بشركة WWW إلى شبكة الاتصالات العالمية.

وهذه القاعدة لإعادة توجيه شبكة الاتصالات العالمية إلى غير www

RewriteEngine On RewriteCond %{HTTP_HOST} !^my-domain\.com$ [NC] RewriteRule ^(.*)$ http://my-domain.com/$1 [R=301,L]

الرجوع من http://dense13.com/blog/2008/02/27/Edirecting-n-wwwww-wwww-with-htaccess/

هذا يعمل بالنسبة لي:

RewriteCond %{HTTP_HOST} ^(?!www.domain.com).*$ [NC]
RewriteRule ^(.*)$  http://www.domain.com$1  [R=301,L]

يمكنني استخدام نمط نظرة الأمام (?!www.domain.com) لاستبعاد www النطاق الفرعي عند إعادة توجيه جميع المجالات إلى www النطاق الفرعي من أجل تجنب حلقة إعادة توجيه لا حصر لها في أباتشي.

الرمز الذي أستخدمه هو:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

إذا كنت تستخدم الحل أعلاه من اثنين <VirtualHost *:80> كتل مع اختلاف ServerNameس...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... ثم أنت يجب أن تحدد NameVirtualHost On كذلك.

إذا كنت لا تفعل ذلك، فإن Apache لا يسمح بنفسه باستخدام المختلف ServerNameS لتمييز الكتل، لذلك يمكنك الحصول على رسالة الخطأ هذه:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... وإما لا يحدث أي إعادة توجيه، أو لديك حلقة إعادة توجيه لا حصر لها، اعتمادا على الكتلة التي وضعتها أولا.

كان لدي مهمة مماثلة على Multisite WP، حيث يجب أن تكون قاعدة إعادة التوجيه عام (لأي مجال معين، أضف إلى الشبكة). لقد حللت أولا إضافة بطاقة البدل إلى المجال (مجال متوقف). لاحظ ال . بعد .com.

CNAME * domain.com.

ثم أضفت الأسطر التالية إلى ملف .htaccess في جذر My Multisite. أعتقد أنه سيعمل لأي موقع.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

نأمل أن يساعد ذلك.

ملاحظة. إذا كنت ترغب في إعادة توجيه من عدم شبكة الاتصالات العالمية، فقم بتغيير السطر الأخير إلى

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

لقد وجدت أنه أسهل (وأكثر فائدة) لاستخدام Serveralias عند استخدام Vhosts متعددة.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

هذا يعمل أيضا مع HTTPS Vhosts.

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