apache إعادة توجيه من غير www إلى www
-
11-09-2019 - |
سؤال
لدي موقع إلكتروني لا يبدو أنه يعيد توجيه من غير 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}
قواعد. جزء المسار غير متأثر به السابق
RewriteRule
s مثل%{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>
لدي فقط مشكلة نفسها. ولكن حل مع هذا
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 لا يسمح بنفسه باستخدام المختلف ServerName
S لتمييز الكتل، لذلك يمكنك الحصول على رسالة الخطأ هذه:
[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.