เปลี่ยนเส้นทางไม่ใช่ www ไปยัง www ใน. htaccess


189

ฉันมีสิ่งนี้ในไฟล์. htaccess ของฉัน:

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

แต่เมื่อใดก็ตามที่ฉันเข้าถึงไฟล์บนรากของฉันเหมือนมันจะเปลี่ยนเส้นทางไปยังhttp://example.com/robots.txthttp://www.example.comrobots.txt/

ฉันจะแก้ไขสิ่งนี้ได้อย่างไรเพื่อที่จะเปลี่ยนเส้นทางไปอย่างถูกต้องhttp://www.example.com/robots.txt?

คำตอบ:


391

เปลี่ยนการกำหนดค่าของคุณเป็นแบบนี้ (เพิ่มเครื่องหมายทับ):

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

หรือวิธีการแก้ปัญหาที่แสดงด้านล่าง (เสนอโดย@absiddiqueLive ) จะใช้ได้กับโดเมนใด ๆ :

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

หากคุณต้องการสนับสนุน http และ https และรักษาตัวเลือกโปรโตคอลไว้ให้ลองปฏิบัติดังนี้:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

คุณจะแทนที่loginด้วยcheckout.phpหรือ URL ใดที่คุณต้องการสนับสนุน HTTPS

ฉันเถียงว่านี่เป็นความคิดที่ไม่ดี สำหรับเหตุผลกรุณาอ่านคำตอบนี้


วิธีนี้ไม่ทำงานเมื่อบางหน้า (เช่นล็อกอินหรือสมัคร) ใช้โปรโตคอล https
Alexey Kosov

ฉันได้อัปเดตโพสต์เล็กน้อยเพื่อรวมข้อมูลบางอย่าง เป็นการยากที่จะเลือกโปรโตคอลที่จะใช้
Randall Hunt

3
วิธีแก้ปัญหาแรกไม่ได้เปลี่ยนเส้นทางเพียงพออันดับที่ 2 ดูเหมือนจะเปลี่ยนเส้นทางมากเกินไป ตัวอย่างเช่นblog.example.comจะกลายเป็นwww.blog.example.com
gman

คุณช่วยเพิ่มวิธีการหลีกเลี่ยงการเปลี่ยนเส้นทางในขณะที่พัฒนาบน localhost ได้หรือไม่?
Bugs Bunny

ฉันได้ติดตามทุกอย่างที่นี่ แต่ไม่มีอะไรทำงาน ฉันใช้การตั้งค่า laravel ไม่มีใครมีความคิดว่าทำไมมันถึงไม่เหมาะกับฉัน? www.domain.com และ domain.com ทั้งคู่โหลดอย่างถูกต้อง แต่ domain.com ไม่เปลี่ยนเส้นทางไปที่ www.domain.com นี่อาจเป็นปัญหากับ DNS ของฉันหรือไม่
สวัสดีชาวโลก

93

นี่คือโซลูชันที่ถูกต้องซึ่งรองรับ https และ http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
มันสมบูรณ์แบบ แต่ก็ไม่ได้เปลี่ยนเส้นทางโดเมนย่อยให้wwwเหมือนกับโซลูชันทั่วไปอื่น ๆ
เฟเบียน Schmengler

4
นี่เป็นทางออกที่ดีที่สุดทำงานได้ดีกว่าคำตอบที่ยอมรับและดูแล HTTPS อย่างถูกต้อง
23432 Tamik Soziev

3
ทำงานได้อย่างสมบูรณ์แบบ! และในไม่กี่บรรทัด!
zeckdude

8
นี่คือคำตอบที่ดีที่สุด
Andrew

8
หากฉันไม่เข้าใจผิดนี่จะไม่ทำงานมากกว่าหนึ่งจุด ตัวอย่าง:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

สำหรับ Https

RewriteCond %{HTTPS}s ^on(s)|

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

7
โซลูชันนี้เป็นที่ต้องการของ @ ranman เนื่องจากจะทำงานได้กับทุกโดเมนซึ่งจะช่วยลดข้อผิดพลาดของมนุษย์ไม่ว่าเมื่อคุณกำลังใช้รหัสสำหรับโครงการใหม่หรือเมื่อคุณใช้โดเมนเพิ่มเติมกับโครงการที่มีอยู่
Frankie

ฉันชอบการแก้ปัญหานี้ แต่ทำไม^(.*)$แทน(.*)?
Popnoodles

วิธีนี้จะดีกว่า แต่ฉันได้แก้ไขของฉันที่จะมีของคุณเช่นกัน
Randall Hunt

1
มันใช้งานได้กับโดเมนทั้งหมดที่เรียบง่ายและมีประสิทธิภาพ! ขอบคุณ
eirenaios

คุณสามารถติดตาม RewriteCond% {{HTTPS} s ^ ได้ใน | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive

24

ตัวอย่างต่อไปนี้ใช้ได้ทั้งsslและnon-sslและเร็วขึ้นมากเมื่อคุณใช้กฎเพียงข้อเดียวในการจัดการ http และ https

RewriteEngine on


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

[ทดสอบ]

สิ่งนี้จะเปลี่ยนเส้นทาง

http

ถึง

https

ถึง


1
ใกล้มากกับสิ่งที่ฉันมาด้วย รองรับมากกว่าหนึ่งจุดในโฮสต์ HTTP เช่น "mysite.co.uk"
Adambean

2
เพิ่งอยากรู้อยากเห็นทำไมคุณไม่ใช้ R = 301 ที่นี่ มันจะใช้ 302 (ย้าย temp.) โดยค่าเริ่มต้นหากไม่มีการระบุรหัส
Marc

1
ทำงานได้อย่างสมบูรณ์แบบ นี่ควรเป็นคำตอบที่ยอมรับได้
James Nisbet

8

ลองสิ่งนี้ฉันใช้มันในหลาย ๆ เว็บไซต์มันทำงานได้อย่างสมบูรณ์แบบ

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

4

ฉันได้ทดสอบวิธีแก้ปัญหาทั้งหมดข้างต้นแล้ว แต่ไม่ได้ผลสำหรับฉันฉันได้ลองลบ http: // และจะไม่ทำการเปลี่ยนเส้นทางนอกจากนี้จะลบ www ที่มันเปลี่ยนเส้นทางได้ดีดังนั้นฉันสับสนโดยเฉพาะฉันใช้เว็บไซต์ทั้งหมดของฉันภายใต้ https : //

ดังนั้นฉันได้รวมรหัสบางส่วนเข้าด้วยกันและเกิดขึ้นพร้อมกับโซลูชันที่สมบูรณ์แบบสำหรับทั้ง http: // และ https: // และ www และไม่ใช่ www

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

หวังว่าสิ่งนี้จะช่วยให้ใครบางคน :)


3

เพิ่มรหัสต่อไปนี้ในไฟล์. htaccess

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

สามารถดูบทช่วยสอนการเปลี่ยนเส้นทาง URL ได้ที่นี่ - เปลี่ยนเส้นทางไม่ใช่ www ไปยัง www และ HTTP เป็น HTTPS โดยใช้ไฟล์. htaccess


3

การกำหนดค่านี้ทำงานสำหรับฉันใน bitnami wordpress ด้วย SSL ที่กำหนดค่า:

เพิ่มด้านล่างภายใต้ "RewriteEngine On" ในไฟล์ /opt/bitnami/apps/wordpress/conf/httpd-app.conf

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

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

สิ่งนี้จะเปลี่ยนเส้นทางโดเมนของคุณซึ่งไม่ได้เริ่มต้นด้วย WWW ไม่ใช่การเปลี่ยนเส้นทางโดเมนย่อยทั้งหมดของคุณ

มันมีประโยชน์


2

ฉันเชื่อว่าคำตอบยอดนิยมประสบความสำเร็จในการเปลี่ยนเส้นทางที่ไม่ใช่ www ไปยัง www (เช่นmysite.com -> www.mysite.com ) แต่ไม่คำนึงถึงโดเมนย่อยสัญลักษณ์แทนซึ่งส่งผลให้:

random.mysite.com -> www.random.mysite.com

นี่คือวิธีแก้ปัญหาโดยมี / ไม่มี HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* หมายเหตุ: ฉันยังไม่ได้ทดสอบ https เพราะตอนนี้ฉันยังไม่มีหนังสือรับรองการทดสอบ แต่ถ้ามีใครสามารถตรวจสอบหรือปรับปรุงสิ่งที่ฉันมีมันจะยอดเยี่ยม


$ แรกทำอะไรที่นี่: '^ (. *) $'
Vaishal Patel

0

ถ้าเป็นไปได้ให้เพิ่มสิ่งนี้ลงในไฟล์กำหนดค่า Apache หลัก มันเป็นโซลูชันที่มีน้ำหนักเบาและต้องการการประมวลผลน้อยกว่า

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin me@example.com
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

ดังนั้นที่แยกต่างหากVirtualHostสำหรับ "example.com" VirtualHostจับคำขอเหล่านั้นแล้วอย่างถาวรจะเปลี่ยนเส้นทางไปยังหลักของคุณ ดังนั้นจึงไม่มีการแยก REGEX สำหรับทุกคำขอและเบราว์เซอร์ไคลเอ็นต์ของคุณจะแคชการเปลี่ยนเส้นทางเพื่อที่พวกเขาจะไม่ (หรือไม่ค่อย) ร้องขอ URL "ผิด" อีกครั้งช่วยให้คุณประหยัดเซิร์ฟเวอร์

Redirect permanent / http://www.example.com/หมายเหตุเฉือนท้ายใน ก็ไม่มีการเปลี่ยนเส้นทางจากexample.com/asdfจะเปลี่ยนเส้นทางไปแทนhttp://www.example.comasdfhttp://www.example.com/asdf


0

สองคำเตือน

หลีกเลี่ยงการ 301 และต้องการรหัสสถานะการตอบสนอง 303 หรือ 307 ที่ทันสมัย

หลีกเลี่ยง 301

คิดอย่างรอบคอบหากคุณต้องการเปลี่ยนเส้นทางถาวรอย่างถาวร[R=301]เพราะถ้าคุณตัดสินใจที่จะเปลี่ยนในภายหลังผู้เข้าชมก่อนหน้าของหน้าจะยังคงเห็นหน้าของการเปลี่ยนเส้นทางเดิม

ข้อมูลการเปลี่ยนเส้นทางแบบถาวรจะถูกจัดเก็บไว้ในแคชของเบราว์เซอร์บ่อยครั้งและโดยทั่วไปจะกำจัดได้ยาก (การโหลดหน้าเว็บซ้ำไม่สามารถแก้ปัญหาได้) ผู้เข้าชมเว็บไซต์ของคุณจะติดอยู่ในการเปลี่ยนเส้นทางก่อนหน้านี้ "ตลอดไป"

หลีกเลี่ยง 302 เช่นกัน

เวอร์ชันใหม่ของโปรโตคอล HTTP (v1.1) เพิ่มสองสถานะการตอบกลับใหม่ที่สามารถใช้แทน 302 ได้

  • 303 การเปลี่ยนเส้นทาง URL แต่ต้องการเปลี่ยนประเภทของคำขอเป็น GET
  • 307 การเปลี่ยนเส้นทาง URL แต่ต้องการที่จะรักษาประเภทของการร้องขอตามที่ส่งมาในตอนแรก

คุณยังสามารถใช้รหัส302(การเปลี่ยนเส้นทางที่ไม่ถาวร) แม้ว่าจะถือว่าไม่ชัดเจน ไม่ว่าในกรณีใดเบราว์เซอร์ส่วนใหญ่จะใช้งาน302ในลักษณะเดียวกับที่303โค้ดใหม่แนะนำ


คำเตือนของคุณเกี่ยวกับ 301 จะมีผลแม้ว่าเราจะพูดถึงชื่อโดเมนเดียวกันหรือไม่ ไม่แน่ใจว่าวิธีการนี้จะใช้ในกรณีนี้ ... เปลี่ยนเส้นทาง URL ทั้งหมดที่มาจากการhttp://example.com/testing http://www.example.com/testingอาจเป็นวิธีการที่ไม่ดีในระยะยาว? ขอบคุณ
Sara_

-1

เขียนใน. htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

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