.htaccess tüm sayfaları yeni alan adına yönlendirir


218

Altına yönlendirilecek tüm sayfaları olddomain.exampleyönlendirmek için hangi yönlendirme kuralını kullanırım newdomain.example?

Site tamamen farklı bir yapıya sahiptir, bu yüzden eski alan altındaki her sayfanın yeni alan dizin sayfasına yönlendirilmesini istiyorum .

Bunun (olddomain.example taban dizini altında) olacağını düşündüm:

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

Ama şuraya olddomain.example/somepagegidersem yönlendirilirim newdomain.example/somepage. Yalnızca newdomain.examplesayfa soneki olmadan yönlendirmeyi bekliyorum .

Son kısmı nasıl uzak tutarım?


8
Zamandan kazanmak için en iyi cevaba doğru ilerleyin: RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
Özellikle SEO perspektifinden, endeks / ana sayfaya bire bir yönlendirmenin olması genellikle kötü bir fikir olduğunu belirtmek gerekir. Google muhtemelen bunu bir yumuşak 404 olarak görüyor.
MrWhite

Yanıtlar:


201

Böyle olabilir:

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

Hmm, tarayıcınızı yeniden yüklemeyi deneyebilir misiniz? burada xampp ile yeniden yönlendiriyor. Az önce test ettim.
SİZ

Benim kötü ... işe yarıyor, benim barındırma hizmeti fu **** şeyler olan başka bir yönlendirme vardı. Teşekkürler! :)
Yuval Adam

25
Öyle değil mi RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts

1
Uzun bir kıştan sonra nihayet çalışabilmesi için kodu düzenledim. (doğru, EQUAL ve eski etki alanına FARKLI değilse yönlendirmek, bu sorun oldu)
carla

5
@JimGeurts Yalnızca yeni alan adı olmayan HER ŞEYİ yönlendirmek istiyorsanız. Ancak, bu durumda, SADECE eski alan adını yeniden yönlendirmek istedik.
carla

442

Aşağıdaki yanıt potansiyel olarak sonsuz bir yönlendirme döngüsüne neden olabilir ...

Burada, URL'deki alan adından sonraki her şey yeni alan URL'sindeki aynı kopyaya yönlendirilir:

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

www.example.net/somepage.html?var=foo yönlendiriyor www.newdomain.com/somepage.html?var=foo


21
Bu, newdomain.com için olsalar bile, HER istek yeniden yönlendirilmeyecek mi? Ve aslında bu durumlarda iki yinelenen talebe neden olur?
Bill Dami

33
Soru her şeyi ana sayfaya yönlendirmektir
kravits88

28
Bu sorunun cevabı olmasa da, SE'den tam olarak bu cevabı arayan bu soruya geldim. Teşekkürler !!!
dav

Alt alan adından yeni alan adına yönlendirmek için nasıl yapabiliriz?
Sukhjinder Singh

2
Birisi Bill'in sorusuna cevap verebilir mi lütfen? Bu, yinelenen bir isteği ve / veya gereksiz yeniden yazma işlemlerini önlemek için bir RewriteCond kullanmamalı mı? Her ne kadar gerekli olmasa da her seferinde yeniden yazmak için belirgin bir etkisi olmayacağını düşünüyorum. Ama neden yaptın.
Andrew

80

Sadece açıklığa kavuşturmak için, engel olan barındırma yönlendirmesini kaldırdıktan sonra, orijinal çözümüm de çalışır:

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

Bu, sorunuzla ilgili olan varsayılan dizine yönlendirecektir. Daha açık olmak gerekirse, yakınlık nedeniyle, ifadeniz user968421'in bunun hemen üzerindeki cevabına yönlendirilmiş gibi göründüğünden, niyet yeni etki alanında karşılık gelen bir dosya adına yönlendirmek olduğunda user968421'in yanıtı doğrudur.
RationalRabbit

20

Wordpress blogum için bunu .htaccess olarak kullandım. Bu dönüştürür //www.blah.example/asad: http , http: //blah.example/asad , http: //www.blah.example2/asad vb için http: //blah.example/asad sayesinde tüm diğer cevaplar bunu anladım.

<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
Bunu en kapsamlı cevap olarak görüyorum: her sayfa için sıralamayı koruyor ve birincil olmayan tüm alan adları için bir catchall! Daha iyi ne olabilir?
nzn

1
Buradaki anahtar, etki alanı yeniden yazma kuralının WordPress dizini yeniden yazma kuralından önce gelmesidir.
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>

Bu benim için çalıştı


Evet, bu yöntem temiz ve güzel olurdu!, Benim için de çalıştı.
Cody

Bu, eğer herhangi bir - index.php? aa = 9 parametresini yeni etki alanına taşıyacaksa,
URl'deki

13

Bunu yapmanın çeşitli yolları ve çeşitli yönlendirmeler var, bunları aşağıda listeledim:

301 (Kalıcı) Yönlendirme: Tüm siteyi kalıcı olarak farklı bir URL'ye yönlendirin. Bu, en yaygın yönlendirme türüdür ve çoğu durumda yararlıdır. Bu örnekte, "example.com" alanına yönlendiriyoruz:

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

302 (Geçici) Yönlendirme: Tüm siteyi farklı bir geçici URL'ye yönlendirin. Bu, geçici bir açılış sayfanız olduğunda ve daha sonraki bir tarihte ana açılış sayfanıza geri dönmeyi planladığınızda SEO amaçları için yararlıdır:

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

İndex.html dosyasını belirli bir alt klasöre yeniden yönlendirin:

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

Eski bir dosyayı yeni bir dosya yoluna yeniden yönlendirin:

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

Belirli bir dizin sayfasına yönlendir:

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

İlk örneğe 1 $ eklerseniz, bunun gibi Redirect 301 / http://example.com/$1 orijinal sitenin tüm sayfaları yeni site köküne yönlendirilir
Yassine Mokni

@YassinMK $1Burada gerekli değildir, RedirectMatchyönergeyi düşünüyorsunuz (ancak yine $1de referans için bir yakalama grubu tanımlamanız gerekir ).
MrWhite

Tüm bu Redirectdirektifler benzer şekilde yönlendirilecek olsa da , OP sadece yeni sitenin ana sayfasına yönlendirmek istemektedir (ancak kendi başına tavsiye edilmez). Yalnızca RedirectMatchbelirli bir URL'ye yönlendirmek istiyorsanız , yönergeyi kullanmanız gerekebilir .
MrWhite

301 yerine, Redirect permanent / h ttps: //www.example.com yazabilirsiniz, bunu hayalet dosyasında yapabilirsiniz
Yvon Huynh

Ama neden .htaccess ile ilgili soru vhost dosyasından bahsedelim?
RustyIngles

9

Bir konumdan alt alana yönlendirmek istiyorsanız, şunları kullanabilirsiniz:

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


Bu en iyi yol. Çünkü Webhosterların çoğu .htaccess içinde RewriteEngine kullanımına izin vermedi. Bu zaten harika çalışıyor!
Sprinterfreak

Yeniden yönlendirmek için RewriteEngine kullanmanız gerekir. Sorununuzun nedeni RewriteEngine'ın zaten etkin olması ve yalnızca yönlendirme kuralına gereksinim duymanızdır. Yardım ettiğine sevindim.
EmptySD

Doğru değil. Tüm Yeniden Yazma şeylerini atlar ve kullanırken RewriteEngine On500 Dahili Hata atar. Çok kısıtlı bir Web Alanı. Bununla Redirect 301 / http://foobaşa çıkmanın tek yolu kullanmaktır.
Sprinterfreak

6

Eski sitenizi yönlendirdiğiniz yeni alan adı farklı bir ana makinedeyse, Redirect

Redirect 301 / http://newdomain.com

Bu gelen tüm istekleri yönlendirir olddomainiçin newdomain.

Redirectyönergesi çalışmaz veya yeni alan Redirect loopadınız ve eski alan adınızın her ikisi de aynı ana bilgisayardaysa, bu durumda mod-rewriteistenen ana bilgisayar üstbilgisine göre yeniden yönlendirmek için kullanmanız gerekir .

RewriteEngine on


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

5

İtibarım bir cevap hakkında yorum yapmama izin vermiyor, ancak burada en yüksek puan alan cevabın bir hata olduğunu belirtmek istedim:

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

1 $ 'dan önce eğik çizgi olmalı

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

3

SymLinks olarak benim çözüm sunucumda işe yaramadı bu yüzden benim PHP bir If kullandım.

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

Bu, apache'nin eski sürümlerinde (ve mod_rewrite), yol önekinin değiştiğinde yeniden yazılmış yola eklendiği bir hatadır. Buraya bakın

Apache2 V2.2.12'de düzeltildiğini düşünüyorum, bulmanız gerektiğinde buraya ekleyeceğim kullanmanız gereken özel bir bayrak var, (Ben Yol Yok için NP olduğunu düşünüyorum)

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

Neredeyse bir ay boyunca buna karşı başımı çarptım
Question Mark

2

Kullanılabilirlik açısından, yolu istekle birlikte gönderirseniz (yani, şu anda sahip olduğunuz şey) ve yeni sitenizin bununla ilgilenmesine izin verirseniz daha iyi olur:

"/ Ürünler" için arama yaptınız.

Maalesef bu sayfa gitti. Bunun yerine "/ new_products" adresini ziyaret etmek ister misiniz?

(ve daha iyisi, yine de, bunu otomatik olarak yapıyor.)

Bu, daha büyük bir web sitesi için çok fazla kodlama ve sezgisel taramadır, ancak bence kullanıcı memnuniyeti açısından ödeyecektir (rüya ürününüzün dikkatlice kaydedilmiş yer işaretiniz sizi newdomain.com'un ön sayfasına götürdüğünde, bu sinir bozucu.)


Bahsedilen web sitesi için, tüm web sitesi değiştiği için bu hemen hemen ilgisizdir, ancak kesinlikle doğrudur. Web sitesi mümkün olduğunca geriye dönük uyumlu olmalıdır. +1
Yuval Adam

2

Yeniden yönlendirmenin parametre veya sayfa olmadan yeni farklı siteyi (alan adını) tamamlamasını istiyorsanız, şunu kullanın:

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

1
.htaccessBelge kökündeki herhangi bir URL ile eşleşmediğinden , kullanıldığında beklendiği gibi çalışmaz . Bir sunucu yapılandırmasında veya VirtualHost bağlamında çalışır.
MrWhite

2

User968421'in cevabını ve OP'nin çözümünü denedim, ancak tarayıcı bir ödeme sayfası için bir güvenlik hatası attı. Nedenini tam olarak söyleyemem.

Bizim ev sahibi (Site Ground) da anlayamadık.

Nihai çözüm yakındı, ancak user968421'in cevabına hafif bir tweak (yan not: OP'den farklı olarak, sadece ana sayfaya değil, ilgili sayfaya yönlendirmeye çalışıyordum, bu yüzden geri referansı [ $1domain'den sonra] user968421'den korudum Cevap):

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

Bir Host Gator makalesi (umutsuz zamanlar, umutsuz önlemler, amiright?) Tarafından önerilen bu htaccess yönlendirme üretecinden tweak aldım .


2

Bu kadar basit ve bu, sondaki sorguyu URL'den yeni alana taşımayacak.

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

Bu aslında benim için çalıştı, yeni etki alanına herhangi bir sümüklü böcek geçen bir çözüm gerekir Teşekkürler Dsynmphony
Faisal Mehmood Awan

1

Birkaç yerel dosyanın da sunulması gerekiyorsa, Hoster ile koşullu yönlendirmeleri kullanın Options -FollowSymLinksve AllowOverride -Optionsdevre dışı bırakın:

Örnek .htaccess

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

Bu örnek, yerel index.html dosyasını sunacak ve diğer tüm personeli yeni etki alanına yönlendirecektir.


1

Hepsini ana sayfaya yeni alan adına yönlendirmek için bu yöntemi deneyin, Benim için çalışıyor:

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

0

Önceki cevaplar benim için işe yaramadı.

Bu kodu kullandım. OSX kullanıyorsanız, doğru biçimi kullandığınızdan emin olun.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.