.htaccess redirect semua halaman ke domain baru

218

Aturan pengalihan mana yang akan saya gunakan untuk mengalihkan semua halaman di bawah olddomain.exampleuntuk diarahkan newdomain.example?

Situs ini memiliki struktur yang sama sekali berbeda, jadi saya ingin setiap halaman di bawah domain lama untuk diarahkan ke halaman indeks domain baru .

Saya pikir ini akan dilakukan (di bawah direktori basis olddomain.example):

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

Tetapi jika saya menavigasi ke olddomain.example/somepagesaya akan diarahkan ke newdomain.example/somepage. Saya mengharapkan pengalihan hanya ke newdomain.exampletanpa akhiran halaman.

Bagaimana cara menjaga bagian terakhir keluar?

Yuval Adam
sumber
8
Untuk menghemat waktu, gulir ke bawah ke jawaban terbaik yang tepat yaitu RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack
2
Perlu menunjukkan bahwa, terutama dari perspektif SEO, memiliki pengalihan banyak-ke-satu ke indeks / beranda umumnya merupakan ide yang buruk. Google cenderung melihatnya sebagai soft-404.
MrWhite

Jawaban:

201

Mungkin seperti ini:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]
KAMU
sumber
Um, bisakah Anda mencoba memuat ulang browser Anda? bahkan mengarahkan dengan xampp di sini. Saya baru saja menguji.
ANDA
Buruk saya ... itu berfungsi, layanan hosting saya punya beberapa pengalihan lain yang fu **** segalanya. Terima kasih! :)
Yuval Adam
25
Bukan RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts
1
Setelah musim dingin yang panjang saya mengedit kode sehingga akhirnya bisa berfungsi. (yang benar adalah mengarahkan jika EQUAL dan tidak BERBEDA dengan olddomain, itu! adalah masalahnya)
carla
5
@ Jimgeurts Hanya jika Anda ingin mengarahkan kembali SEMUA yang bukan domain baru. Namun, dalam kasus ini, kami ingin mengarahkan domain lama saja.
carla
442

Jawaban di bawah ini berpotensi menyebabkan loop pengalihan tak terbatas ...

Di sini, yang ini mengalihkan semua setelah nama domain pada url ke salinan yang sama persis pada url domain baru:

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

www.example.net/somepage.html?var=foo dialihkan ke www.newdomain.com/somepage.html?var=foo

Chris Stryczynski
sumber
21
tidakkah pengalihan ini SETIAP permintaan, bahkan yang untuk newdomain.com? Dan pada dasarnya menyebabkan dua permintaan rangkap dalam kasus-kasus itu?
Bill Dami
33
Pertanyaannya adalah untuk mengarahkan kembali semuanya ke halaman rumah
kravits88
28
Meskipun ini bukan jawaban dari pertanyaan, tetapi saya datang ke pertanyaan ini dari SE mencari jawaban ini. terima kasih !!!
dav
Bagaimana kita dapat melakukan pengalihan dari subdomain ke domain baru?
Sukhjinder Singh
2
Bisakah seseorang menjawab pertanyaan Bill? Bukankah ini harus menggunakan RewriteCond untuk mencegah permintaan duplikat dan / atau menulis ulang yang tidak perlu? Saya kira itu tidak akan memiliki dampak nyata untuk menulis ulang setiap kali walaupun itu tidak perlu. Tapi mengapa melakukannya?
Andrew
80

Sekedar klarifikasi, setelah menghapus pengalihan hosting yang menghalangi, solusi asli saya juga berfungsi:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]
Yuval Adam
sumber
Ini akan mengarahkan ulang ke indeks default, yang merupakan pertanyaan Anda. Hanya untuk kejelasan, karena, karena kedekatan, pernyataan Anda tampaknya diarahkan ke jawaban pengguna968421 tepat di atas ini, jawaban pengguna968421 benar ketika tujuannya adalah untuk mengarahkan ulang ke nama file yang sesuai di domain baru.
RationalRabbit
19

Saya telah menggunakan blog Wordpress saya ini sebagai .htaccess. Itu mengkonversi http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad dll, ke http: //blah.example/asad Terima kasih kepada semua jawaban lain saya menemukan jawabannya.

<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>
Daantje
sumber
2
Saya menganggap ini jawaban yang paling komprehensif: menjaga peringkat untuk setiap halaman dan merupakan tantangan untuk semua domain yang bukan yang utama! Apa yang bisa lebih baik?
nzn
1
Kuncinya di sini adalah aturan penulisan ulang domain muncul sebelum aturan penulisan ulang indeks 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>

Ini berhasil untuk saya

Iana Sergieieva
sumber
Ya, metode ini akan bersih dan menyenangkan !, bekerja untuk saya juga.
Cody
ini akan mengarahkan ulang dengan parameter dalam URl jika ada - index.php? aa = 9 akan membawa parameter ke domain baru
Darksymphony
13

Ada berbagai cara untuk melakukan ini dan berbagai pengalihan, saya telah mencantumkannya di bawah ini:

301 (Permanen) Redirect: Arahkan seluruh situs ke URL yang berbeda secara permanen. Ini adalah jenis pengalihan yang paling umum dan berguna dalam sebagian besar situasi. Dalam contoh ini, kami mengarahkan ulang ke domain "example.com":

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

302 Pengalihan (Sementara): Arahkan seluruh situs ke URL sementara yang berbeda. Ini berguna untuk keperluan SEO ketika Anda memiliki halaman arahan sementara dan berencana untuk beralih kembali ke halaman arahan utama Anda di kemudian hari:

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

Redirect index.html ke subfolder tertentu:

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

Mengarahkan file lama ke jalur file baru:

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

Redirect ke halaman indeks tertentu:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html
RustyIngles
sumber
Jika Anda menambahkan $ 1 ke contoh pertama, seperti ini Redirect 301 / http://example.com/$1 maka semua halaman situs asli akan diarahkan ke root situs baru
Yassine Mokni
@YassinMK Tidak $1diperlukan di sini, Anda berpikir tentang RedirectMatcharahan (tapi kemudian Anda masih perlu mendefinisikan grup penangkap untuk $1referensi ke).
MrWhite
Meskipun semua Redirectarahan ini akan mengarahkan seperti untuk, sedangkan OP ingin mengarahkan hanya ke halaman rumah situs baru (meskipun itu sendiri tidak direkomendasikan). Anda mungkin perlu menggunakan RedirectMatcharahan jika Anda hanya ingin mengarahkan ulang ke URL tertentu.
MrWhite
alih-alih 301 Anda juga bisa menulis Redirect permanen / ttps: //www.example.com, Anda dapat melakukan ini di file vhost
Yvon Huynh
Tetapi pertanyaan terkait dengan .htaccess jadi mengapa menyebutkan file vhost?
RustyIngles
9

Jika Anda ingin mengalihkan dari beberapa lokasi ke subdomain Anda dapat menggunakan:

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

EmptySD
sumber
Itu cara terbaik. Karena banyak Webhosters tidak mengizinkan penggunaan RewriteEngine di .htaccess. Ini bekerja dengan baik!
Sprinterfreak
Anda harus menggunakan RewriteEngine untuk mengarahkan ulang. Alasan mengapa Anda memiliki masalah adalah RewriteEngine sudah aktif dan Anda hanya memerlukan aturan pengalihan. Saya senang itu membantu.
EmptySD
Tidak benar. Itu melompati semua hal Menulis ulang dan saat menggunakan RewriteEngine Onmelempar 500 Kesalahan Internal. Ini adalah Webspace yang sangat terbatas. Menggunakan Redirect 301 / http://fooadalah satu-satunya cara yang mungkin untuk dilakukan.
Sprinterfreak
6

Jika domain baru tempat Anda mengarahkan situs lama Anda berada pada host lain, Anda bisa menggunakan a Redirect

Redirect 301 / http://newdomain.com

Ini akan mengalihkan semua permintaan dari olddomainke newdomain.

Redirectarahan tidak akan berfungsi atau dapat menyebabkan a Redirect loopjika domain baru dan domain lama Anda keduanya ada di host yang sama, dalam hal ini Anda harus menggunakan mod-rewriteuntuk mengarahkan ulang berdasarkan header host yang diminta.

RewriteEngine on


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

Reputasi saya tidak akan memungkinkan saya untuk mengomentari jawaban, tetapi saya hanya ingin menunjukkan bahwa jawaban dengan nilai tertinggi di sini memiliki kesalahan:

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

harus memiliki garis miring sebelum $ 1, jadi

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

Solusi saya sebagai SymLinks tidak berfungsi di server saya jadi saya menggunakan If di PHP saya.

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();
}
Brent
sumber
2

Ini adalah bug dalam versi apache yang lebih lama (dan dengan demikian mod_rewrite) di mana awalan jalur ditambahkan ke jalur yang ditulis ulang jika diubah. Lihat disini

Saya pikir itu diperbaiki di apache2 V2.2.12, ada bendera khusus yang perlu Anda gunakan yang akan saya tambahkan di sini ketika saya menemukannya, (saya pikir itu NP untuk No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]
Tanda tanya
sumber
Saya membenturkan kepala saya terhadap ini selama hampir satu bulan
Tanda Tanya
2

Dari sudut pandang kegunaan, akan lebih baik, jika Anda juga mengirim jalur dengan permintaan (yaitu, apa yang Anda miliki saat ini) dan biarkan situs baru Anda menanganinya:

Anda mencari "/ produk".

Sayangnya halaman ini hilang. Apakah Anda ingin mengunjungi "/ new_products"?

(dan lebih baik lagi, melakukan ini secara otomatis.)

Ini jelas banyak pengkodean dan heuristik untuk situs web yang lebih besar, tetapi menurut saya itu akan membayar dalam hal kepuasan pengguna (ketika bookmark yang disimpan dengan hati-hati dari produk impian Anda hanya membawa Anda ke halaman depan newdomain.com, ini membuat frustrasi.)

Boldewyn
sumber
Untuk kata situs web ini cukup tidak relevan karena seluruh situs web telah berubah, tetapi Anda benar-benar benar. Situs web harus serasi mundur mungkin. +1
Yuval Adam
2

Jika Anda ingin mengarahkan ulang untuk menyelesaikan situs (domain) baru yang berbeda tanpa parameter atau halaman, gunakan ini:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]
MCurbelo
sumber
1
Ini tidak akan berfungsi seperti yang diharapkan ketika digunakan .htaccesskarena tidak akan cocok dengan URL apa pun di root dokumen. Ini akan berfungsi dalam konfigurasi server atau konteks VirtualHost.
MrWhite
2

Saya mencoba jawaban user968421 dan solusi OP tetapi browser muncul kesalahan keamanan untuk halaman checkout. Saya tidak bisa memberi tahu Anda mengapa sebenarnya.

Tuan rumah kami (Ground Site) juga tidak dapat menemukannya.

Solusi terakhirnya sudah dekat, tetapi sedikit perubahan pada jawaban user968421 (catatan: tidak seperti OP, saya mencoba untuk mengarahkan kembali ke halaman yang sesuai, tidak hanya ke beranda jadi saya mempertahankan referensi belakang [ $1setelah domain] dari user968421's menjawab):

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

Mendapat tweak dari generator pengalihan htaccess ini direkomendasikan oleh artikel Host Gator (kali putus asa, tindakan putus asa, oke?).

J May
sumber
2

Sederhana seperti ini dan ini tidak akan membawa kueri penelusuran dari URL ke domain baru.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]
Darksymphony
sumber
yang benar-benar bekerja untuk saya, butuh solusi tanpa mengeluarkan siput ke domain baru Terima kasih Dsynmphony
Faisal Mehmood Awan
1

Gunakan pengalihan bersyarat dengan Options -FollowSymLinksdan AllowOverride -Optionsdinonaktifkan oleh Hoster jika beberapa file lokal juga dilayani:

Contoh .htaccess

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

Contoh ini akan melayani index.html lokal dan mengalihkan semua staf lain ke domain baru.

Sprinterfreak
sumber
1

Coba metode ini untuk mengalihkan semua ke beranda domain baru, Ini berfungsi untuk saya:

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

Jawaban sebelumnya tidak berhasil untuk saya.

Saya menggunakan kode ini. Jika Anda menggunakan OSX pastikan untuk menggunakan format yang benar.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Alfrex92
sumber