.htaccess - วิธีบังคับ“ www.” ในลักษณะทั่วไป?


102

สิ่งนี้จะเปลี่ยนdomain.comเป็นwww.domain.com:

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

ฉันจะแทนที่ส่วน "โดเมน" เพื่อให้ทำงานกับโดเมนใด ๆ ได้อย่างไร

คำตอบ:


249

ฉันจะใช้กฎนี้:

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

เงื่อนไขแรกตรวจสอบว่าค่าโฮสต์ไม่ว่างเปล่า (ในกรณี HTTP / 1.0) ครั้งที่สองตรวจสอบว่าค่าโฮสต์ไม่ได้ขึ้นต้นด้วยwww.หรือไม่ ตรวจสอบที่สามสำหรับ HTTPS ( %{HTTPS}อย่างใดอย่างหนึ่งonหรือoffเพื่อให้%{HTTPS}sเป็นอย่างใดอย่างหนึ่งonsหรือoffsและในกรณีของจะถูกจับคู่) ส่วนการแทนที่จากนั้นจะรวมส่วนข้อมูลเข้ากับ URL แบบเต็มonssRewriteRule


31
โซลูชันนี้ใช้ได้เฉพาะเมื่อคุณต้องการให้โดเมนย่อยทั้งหมดส่งต่อไปที่ www.yourdomain.com หากคุณต้องการบังคับ www เท่านั้นคุณควรอัปเดตบรรทัดที่สองเป็น:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky

2
ฉันไม่ได้รับโดเมนย่อยใด ๆของฉันที่ส่งต่อไปยัง www.mydomain.com โดยใช้กฎที่โพสต์ไว้ในคำถาม ...
lol

3
ฉลาดมาก! ฉันชอบที่คุณบังคับให้เช็ค HTTPS ส่งคืน "S" ในกลุ่มการจับภาพซึ่งคุณใช้ในบรรทัดต่อไปนี้ สวยหรูมาก
code_monk

ดูเหมือนคำตอบทั่วไปครอบคลุม HTTP และโปรโตคอลปกติทำงานได้อย่างมีเสน่ห์
Clain Dsilva

1
ขอบคุณ! ฉันจะเพิ่มRewriteEngine Onเป็นบรรทัดแรกเพื่อทำให้เสร็จสมบูรณ์เนื่องจากอาจทำให้เกิดข้อผิดพลาด 500 เซิร์ฟเวอร์หากคัดลอกวางตามที่เป็นอยู่
Ryan Casas


5

หากคุณต้องการเปลี่ยนเส้นทางคำขอที่ไม่ใช่ www ทั้งหมดไปยังไซต์ของคุณไปยังเวอร์ชัน www สิ่งที่คุณต้องทำคือเพิ่มโค้ดต่อไปนี้ในไฟล์. htaccess ของคุณ:

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

3

สิ่งนี้ใช้ไม่ได้กับโดเมนย่อย

domain.com ถูกเปลี่ยนเส้นทางไปยัง www.domain.com

แต่

images.domain.com จะเปลี่ยนเส้นทางไปที่ www.images.domain.com

แทนที่จะตรวจสอบว่าโดเมนย่อย "ไม่ใช่ www" ให้ตรวจสอบว่ามีจุดสองจุดหรือไม่:

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

ฉันชอบวิธีนี้ อย่างไรก็ตามเพื่อให้บรรลุสิ่งเดียวกันกับ TLDs เช่น. co.uk?
TylersSN

1
@iUseMagento ตอนนี้เพียงแค่เพิ่มจุดเช่น: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](พูดอย่างเคร่งครัด TLD ของคุณยังคงอยู่.ukและโดเมนของคุณคือsomething.co)
mirabilos

.co ในกรณีนี้คือโดเมนระดับที่สองและไม่ได้เป็นส่วนหนึ่งของโดเมนของคุณโดยที่. uk เป็นรหัสประเทศ TLD บอกตามตรงว่าเคยทำงานในอุตสาหกรรมโฮสติ้งและได้เห็นรูปแบบใหม่สำหรับชื่อโดเมนฉันไม่เห็นรูปแบบ TLD ปัจจุบันที่ใช้งานได้นานนอกเหนือจากการใช้งานอย่างเป็นทางการ การปกครององค์กร ฯลฯ ในอนาคตอันใกล้นี้เมื่อคุณสามารถลงทะเบียน fqdn เช่น fred.bloggs ในราคาที่ใกล้เคียงกับบรรทัดฐานปัจจุบันเว็บส่วนบุคคลจะดูแตกต่างจากมุมมอง DNS มาก
คริส

1

ต่อไปนี้ควรนำหน้า 'www' ไปยังคำขอใด ๆ ที่ไม่มีและเปลี่ยนเส้นทางคำขอที่แก้ไขไปยัง URI ใหม่

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

1
RewriteEngine On

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

สิ่งนี้เปลี่ยนเส้นทางexample.comไปยังการwww.example.comยกเว้นโดเมนย่อย


สำหรับฉันดูเหมือนว่าจะส่ง www.example.com ไปที่ www.www.example.com ฮ่า ๆ
Albert Renshaw

@ อัลเบิร์ตบางทีอาจเป็นเพราะแคชของเบราว์เซอร์ของคุณ ล้างแคชของคุณแล้วลองอีกครั้ง
Amit Verma

คุณถูก! ฉันเพิ่งวิ่งในโหมดไม่ระบุตัวตน (โครเมี่ยม) และใช้งานได้ดีขอบคุณ!
Albert Renshaw

1
ฉันชอบกฎทั่วไปนี้มาก แต่ใช้ไม่ได้กับdomain.co.uk เนื่องจากมีจุดสองจุดอยู่แล้ว จะเปลี่ยนกฎนี้เพื่อให้ใช้กับ. co.uk ได้อย่างไร
Sacha Vorbeck

1
สำหรับ. co.uk และ cctld ย่อยอื่น ๆ สิ่งนี้ใช้ได้: ^ ([^.] + \. [^.] +) (\. (uk | ar | cy | ar | tr))? $ แต่น่าเสียดายที่มีบางส่วนผสมกัน พิมพ์ tlds ( wiki.mozilla.org/TLD_List ) เช่น es ที่อนุญาตให้ domain.es และ domain.com.es การเพิ่ม | es ใน regex จะตรงกับ domain.es และ www.domain.es ซึ่งไม่ต้องการที่นี่ ต้องหาวิธีจัดการ sub-cctlds แบบผสมนี้
Sacha Vorbeck

0

นี่เป็นคำถามที่เก่ากว่าและมีหลายวิธีในการทำเช่นนี้ คำตอบที่สมบูรณ์แบบที่สุด IMHO จะพบได้ที่นี่: https://gist.github.com/vielhuber/f2c6bdd1ed9024023fe4 (การวางและจัดรูปแบบโค้ดที่นี่ไม่ได้ผลสำหรับฉัน)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.