.htaccess เปลี่ยนเส้นทางหน้าทั้งหมดไปยังโดเมนใหม่


218

ซึ่งกฎการเปลี่ยนเส้นทางฉันจะใช้ในการเปลี่ยนเส้นทางหน้าเว็บทั้งหมดภายใต้olddomain.exampleการถูกเปลี่ยนเส้นทางไปnewdomain.example?

เว็บไซต์ที่มีโครงสร้างที่แตกต่างกันโดยสิ้นเชิงดังนั้นฉันต้องการทุกหน้าภายใต้โดเมนเก่าที่จะถูกนำไปยังโดเมนใหม่หน้าดัชนี

ฉันคิดว่าสิ่งนี้จะทำ (ภายใต้ไดเรกทอรีฐาน olddomain.example):

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.example/ [R=301]

แต่ถ้าผมนำทางไปยังที่ฉันได้รับการเปลี่ยนเส้นทางไปยังolddomain.example/somepage newdomain.example/somepageฉันคาดหวังว่าจะเปลี่ยนเส้นทางไปที่newdomain.exampleโดยไม่มีคำต่อท้ายหน้า

ฉันจะแยกส่วนสุดท้ายออกได้อย่างไร


8
หากต้องการประหยัดเวลาให้เลื่อนลงไปที่คำตอบที่ถูกต้องที่สุดคือRewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
เป็นค่าชี้ให้เห็นว่าโดยเฉพาะอย่างยิ่งจากมุมมอง SEO มีหลายต่อหนึ่งการเปลี่ยนเส้นทางไปยังดัชนี / หน้าแรกโดยทั่วไปเป็นความคิดที่ดี Google มีแนวโน้มที่จะเห็นว่ามันเป็น soft-404
MrWhite

คำตอบ:


201

อาจเป็นเช่นนี้

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]

อืมคุณลองโหลดเบราว์เซอร์ของคุณใหม่ได้ไหม มันเปลี่ยนเส้นทางด้วย xampp ที่นี่ ฉันเพิ่งทดสอบ
คุณ

ฉันไม่ดี ... มันใช้งานได้บริการโฮสติ้งของฉันมีการเปลี่ยนเส้นทางอื่นซึ่งเป็นเรื่องที่ไม่ดี ขอบคุณ! :)
Yuval Adam

25
มันจะRewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]ไม่เป็นอย่างนั้นหรือ
Jim Geurts

1
หลังจากฤดูหนาวที่ยาวนานฉันแก้ไขรหัสเพื่อให้สามารถทำงานได้ในที่สุด (ที่ถูกต้องคือการเปลี่ยนเส้นทางถ้าเท่ากับและไม่แตกต่างกันไปยังโดเมนเก่านั่นเป็นปัญหา)
carla

5
@JimGeurts เฉพาะเมื่อคุณต้องการเปลี่ยนเส้นทาง EVERYTHING ที่ไม่ใช่โดเมนใหม่ อย่างไรก็ตามในกรณีนี้เราต้องการเปลี่ยนเส้นทางเฉพาะโดเมนเก่าเท่านั้น
carla

442

คำตอบด้านล่างอาจทำให้ลูปเปลี่ยนเส้นทางไม่สิ้นสุด ...

ที่นี่อันนี้เปลี่ยนเส้นทางทุกอย่างหลังจากชื่อโดเมนใน url ไปยังสำเนาเดียวกันแน่นอนใน url โดเมนใหม่:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

www.example.net/somepage.html?var=foo เปลี่ยนเส้นทางไปยัง www.newdomain.com/somepage.html?var=foo


21
สิ่งนี้จะไม่เปลี่ยนเส้นทางทุกคำขอแม้ว่าจะเป็น newdomain.com ก็ตาม และเป็นสาเหตุให้เกิดคำขอซ้ำซ้อนสองคำขอในกรณีเหล่านั้นหรือไม่
Bill Dami

33
คำถามคือการเปลี่ยนเส้นทางทุกสิ่งไปที่หน้าแรก
kravits88

28
แม้ว่านี่ไม่ใช่คำตอบของคำถาม แต่ฉันมาถึงคำถามนี้จาก SE เพื่อหาคำตอบนี้ ขอบคุณ !!!
dav

เราจะเปลี่ยนเส้นทางจากโดเมนย่อยไปยังโดเมนใหม่ได้อย่างไร
Sukhjinder Singh

2
มีคนช่วยตอบคำถามของ Bill ได้ไหม สิ่งนี้ไม่ควรใช้ RewriteCond เพื่อป้องกันการร้องขอซ้ำและ / หรือการเขียนซ้ำที่ไม่จำเป็น? ฉันคิดว่ามันจะไม่มีผลกระทบที่เห็นได้ชัดเจนในการเขียนซ้ำทุกครั้งแม้ว่าจะไม่จำเป็นก็ตาม แต่ทำไมถึงทำ
Andrew

80

เพื่อชี้แจงหลังจากลบการเปลี่ยนเส้นทางโฮสติ้งซึ่งเป็นไปในทางเดียวกันโซลูชันดั้งเดิมของฉันก็ใช้งานได้:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]

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

19

ฉันใช้บล็อก Wordpress ของฉันเป็น. htaccess มันแปลงhttp: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asadฯลฯ เป็นhttp: //blah.example/asad ขอบคุณทุกคน คำตอบอื่น ๆ ฉันคิดออกนี้

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

2
ฉันคิดว่านี่เป็นคำตอบที่ครอบคลุมมากที่สุดของทั้งหมด: มันรักษาอันดับสำหรับทุกหน้าและเป็น catchall สำหรับโดเมนทั้งหมดที่ไม่ใช่หลัก! อะไรจะดีไปกว่านี้?
นิวซีแลนด์

1
กุญแจสำคัญในที่นี้คือกฎการเขียนโดเมนนั้นมาก่อนกฎการเขียนดัชนีของ WordPress
MrMoxy

14
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^olddomain.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.olddomain.com$
  RewriteRule (.*)$ http://www.newdomain.com/$1 [R=301,L]
</IfModule>

สิ่งนี้ใช้ได้สำหรับฉัน


ใช่วิธีนี้จะสะอาดและดี! ใช้ได้สำหรับฉันเช่นกัน
โคดี้

สิ่งนี้จะเปลี่ยนเส้นทางด้วยพารามิเตอร์ใน URl ถ้ามี - index.php? aa = 9 จะนำพารามิเตอร์ไปยังโดเมนใหม่
Darksymphony

13

มีหลายวิธีในการทำเช่นนี้และการเปลี่ยนเส้นทางต่าง ๆ ฉันได้แสดงรายการไว้ด้านล่าง:

301 (ถาวร) การเปลี่ยนเส้นทาง: ชี้ไซต์ทั้งหมดไปยัง URL อื่นอย่างถาวร นี่เป็นประเภทการเปลี่ยนเส้นทางที่ใช้กันทั่วไปและมีประโยชน์ในสถานการณ์ส่วนใหญ่ ในตัวอย่างนี้เรากำลังเปลี่ยนเส้นทางไปยังโดเมน "example.com":

# This allows you to redirect your entire website to any other domain
Redirect 301 / http://example.com/

302 (ชั่วคราว) การเปลี่ยนเส้นทาง: ชี้ทั้งไซต์ไปยัง URL ชั่วคราวอื่น สิ่งนี้มีประโยชน์สำหรับวัตถุประสงค์ SEO เมื่อคุณมีหน้า Landing Page ชั่วคราวและวางแผนที่จะเปลี่ยนกลับไปยังหน้า Landing Page หลักของคุณในภายหลัง:

# This allows you to redirect your entire website to any other domain
Redirect 302 / http://example.com/

เปลี่ยนเส้นทาง index.html ไปยังโฟลเดอร์ย่อยเฉพาะ:

# This allows you to redirect index.html to a specific subfolder
Redirect /index.html http://example.com/newdirectory/

เปลี่ยนเส้นทางไฟล์เก่าไปยังเส้นทางไฟล์ใหม่:

# Redirect old file path to new file path
Redirect /olddirectory/oldfile.html http://example.com/newdirectory/newfile.html

เปลี่ยนเส้นทางไปยังหน้าดัชนีเฉพาะ:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html

หากคุณเพิ่ม $ 1 เป็นตัวอย่างแรกเช่นนี้Redirect 301 / http://example.com/$1 แล้วหน้าทั้งหมดของไซต์ดั้งเดิมจะถูกเปลี่ยนเส้นทางไปยังรูทไซต์ใหม่
Yassine Mokni

@YassinMK $1ไม่จำเป็นต้องที่นี่คุณกำลังคิดของRedirectMatchคำสั่ง (แต่แล้วคุณจะยังคงต้องกำหนดกลุ่มการจับภาพสำหรับการ$1อ้างอิงถึง)
MrWhite

ถึงแม้ว่าRedirectคำสั่งทั้งหมดเหล่านี้จะเปลี่ยนเส้นทางชอบเช่นในขณะที่ OP ต้องการที่จะเปลี่ยนเส้นทางเพียงไปที่หน้าแรกของเว็บไซต์ใหม่ (แม้ว่าจะไม่แนะนำในตัวเองก็ตาม) คุณอาจต้องใช้RedirectMatchคำสั่งหากคุณต้องการเปลี่ยนเส้นทางไปยัง URL ที่ระบุ
MrWhite

แทนที่จะเป็น 301 คุณสามารถเขียน Redirect ถาวร / h ttps: //www.example.com คุณสามารถทำได้ในไฟล์ vhost
Yvon Huynh

แต่คำถามที่เกี่ยวข้องกับ. htaccess เหตุใดจึงพูดถึงไฟล์ vhost
RustyIngles

9

หากคุณต้องการเปลี่ยนเส้นทางจากที่ตั้งไปยังโดเมนย่อยคุณสามารถใช้:

Redirect 301 /Old-Location/ http://subdomain.yourdomain.com


มันเป็นวิธีที่ดีที่สุด เนื่องจาก Webhosters ส่วนใหญ่ไม่อนุญาตให้ใช้ RewriteEngine ใน. htaccess มันใช้งานได้ดีอยู่แล้ว!
Sprinterfreak

คุณต้องใช้ RewriteEngine เพื่อเปลี่ยนเส้นทาง เหตุผลที่คุณมีปัญหาคือ RewriteEngine เปิดใช้งานอยู่แล้วและคุณต้องการเพียงกฎการเปลี่ยนเส้นทาง ฉันดีใจที่ได้ช่วย
EmptySD

ไม่จริง. มันข้ามสิ่งที่เขียนRewriteEngine Onซ้ำทั้งหมดและเมื่อใช้งานพ่นข้อผิดพลาดภายใน 500 ข้อ มันเป็น Webspace ที่ จำกัด มาก ๆ การใช้Redirect 301 / http://fooเป็นวิธีเดียวที่จะจัดการได้
Sprinterfreak

6

หากโดเมนใหม่ที่คุณเปลี่ยนเส้นทางไปยังเว็บไซต์เก่าของคุณอยู่ในโฮสต์ที่แตกต่างกันคุณสามารถใช้ Redirect

Redirect 301 / http://newdomain.com

นี้จะเปลี่ยนเส้นทางการร้องขอทั้งหมดจากไปolddomainnewdomain

Redirectคำสั่งจะไม่ทำงานหรืออาจทำให้ a Redirect loopหากโดเมนใหม่และโดเมนเก่าของคุณทั้งสองอยู่ในโฮสต์เดียวกันในกรณีนี้คุณจะต้องใช้mod-rewriteเพื่อเปลี่ยนเส้นทางตามส่วนหัวของโฮสต์ที่ร้องขอ

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 

5

ชื่อเสียงของฉันไม่อนุญาตให้ฉันแสดงความคิดเห็นกับคำตอบ แต่ฉันแค่ต้องการชี้ให้เห็นว่าคำตอบที่ได้รับคะแนนสูงสุดที่นี่มีข้อผิดพลาด:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com$1 [R=301,L]

ควรมีเครื่องหมายทับก่อน $ 1 ดังนั้น

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

3

โซลูชันของฉันในฐานะ SymLinks ไม่ทำงานบนเซิร์ฟเวอร์ของฉันดังนั้นฉันจึงใช้ If ใน PHP ของฉัน

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
$redirect = str_replace("www.", "", curPageURL());
$remove_http_root    = str_replace('http://', '', $redirect);
$split_url_array     = explode('/', $remove_http_root );


if($split_url_array[0] == "olddomain.com"){
    header("Location: http://www.newdomain.com/$split_url_array[1]");
    die();
}

2

นี่เป็นข้อผิดพลาดใน apache รุ่นเก่า (และ mod_rewrite) ซึ่งคำนำหน้าเส้นทางถูกผนวกเข้ากับเส้นทางที่เขียนใหม่หากมีการเปลี่ยนแปลง ดูที่นี่

ฉันคิดว่ามันได้รับการแก้ไขใน apache2 V2.2.12 มีธงพิเศษที่คุณต้องใช้ซึ่งฉันจะเพิ่มที่นี่เมื่อฉันพบมัน (ฉันคิดว่ามันเป็น NP สำหรับ No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]

ฉันกระแทกหัวของฉันกับสิ่งนี้เกือบเดือน
เครื่องหมายคำถาม

2

จากมุมมองการใช้งานมันจะดีกว่าถ้าคุณส่งเส้นทางพร้อมคำขอ (เช่นสิ่งที่คุณมีในขณะนี้) และให้ไซต์ใหม่ของคุณจัดการกับมัน:

คุณค้นหา "/ products"

น่าเสียดายที่หน้านี้หายไป คุณต้องการไปที่ "/ new_products" แทนหรือไม่

(และดีกว่ายังทำสิ่งนี้โดยอัตโนมัติ)

เห็นได้ชัดว่านี่เป็นการเข้ารหัสและฮิวริสติกสำหรับเว็บไซต์ขนาดใหญ่ แต่ในความคิดของฉันมันจะจ่ายในแง่ของความพึงพอใจของผู้ใช้ (เมื่อบุ๊คมาร์คที่คุณบันทึกไว้อย่างระมัดระวังของผลิตภัณฑ์ในฝันของคุณเพียงนำคุณไปสู่หน้าแรกของ newdomain.com กำลังหงุดหงิด)


สำหรับเว็บไซต์ที่กล่าวมานี้ค่อนข้างไม่เกี่ยวข้องเลยเพราะทั้งเว็บไซต์มีการเปลี่ยนแปลง แต่คุณถูกต้องอย่างแน่นอน เว็บไซต์ควรเข้ากันได้ย้อนหลังเท่าที่จะทำได้ +1
Yuval Adam

2

หากคุณต้องการเปลี่ยนเส้นทางให้เสร็จสมบูรณ์ไซต์ (โดเมน) ใหม่ที่ไม่มีพารามิเตอร์หรือหน้าให้ใช้สิ่งนี้:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]

1
สิ่งนี้จะไม่ทำงานอย่างที่คาดไว้เมื่อใช้.htaccessเพราะจะไม่ตรงกับ URL ใด ๆ ในรูทเอกสาร มันจะทำงานในการกำหนดค่าเซิร์ฟเวอร์หรือบริบท VirtualHost
MrWhite

2

ฉันลองคำตอบของ user968421 และวิธีแก้ปัญหาของ OP แต่เบราว์เซอร์โผล่ข้อผิดพลาดด้านความปลอดภัยสำหรับหน้าเช็คเอาต์ ฉันไม่สามารถบอกคุณได้ว่าทำไม

โฮสต์ของเรา (Site Ground) ไม่สามารถระบุได้

ทางออกสุดท้ายอยู่ใกล้ แต่บิดเล็กน้อยกับคำตอบของ user968421 (หมายเหตุด้าน: ไม่เหมือนกับ OP ฉันพยายามเปลี่ยนเส้นทางไปยังหน้าที่สอดคล้องกันไม่ใช่แค่ไปที่หน้าแรกดังนั้นฉันจึงคงการอ้างอิงกลับ [ $1หลังจากโดเมน] จาก user968421 ตอบ):

RewriteEngine on
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]

รับการปรับแต่งจากตัวสร้างการเปลี่ยนเส้นทาง htaccess ที่แนะนำโดยบทความ Host Gator (เวลาที่สิ้นหวัง


2

เรียบง่ายเช่นนี้และสิ่งนี้จะไม่นำการสืบค้นที่ต่อท้ายจาก URL ไปยังโดเมนใหม่

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]

ที่ใช้งานได้จริงสำหรับฉันต้องการวิธีแก้ปัญหาโดยไม่ผ่านทากใด ๆ ไปยังโดเมนใหม่ขอบคุณ Dsynmphony
Faisal Mehmood Awan

1

ใช้การเปลี่ยนเส้นทางแบบมีเงื่อนไขด้วยOptions -FollowSymLinksและAllowOverride -Optionsปิดการใช้งานโดย Hoster หากไฟล์ในตัวเครื่องควรได้รับการแสดงด้วย:

ตัวอย่าง. htaccess

# Redirect everything except index.html to http://foo
<FilesMatch "(?<!index\.html)$">
    Redirect 301 / http://foo/
</FilesMatch>

ตัวอย่างนี้จะให้บริการ index.html ในเครื่องและเปลี่ยนเส้นทางพนักงานอื่น ๆ ไปยังโดเมนใหม่


1

ลอง methode นี้เพื่อเปลี่ยนเส้นทางไปยังโดเมนใหม่ทั้งหมดในหน้าแรกมันใช้งานได้สำหรับฉัน:

RewriteCond %{HTTP_HOST} ^olddomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.olddomain\.com$
RewriteRule ^(.*)$ "https\:\/\/newdomain\.com\/" [R=301,L]

0

คำตอบก่อนหน้านี้ไม่ทำงานสำหรับฉัน

ฉันใช้รหัสนี้ หากคุณใช้ OSX ตรวจสอบให้แน่ใจว่าใช้รูปแบบที่ถูกต้อง

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.