Genel htaccess yönlendirmesi www'yi www dışı


484

Ben yönlendirmek istiyorum www.example.comiçin example.com. Aşağıdaki htaccess kodu bunu gerçekleştirir:

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

Ancak, alan adını zor kodlamadan bunu genel bir şekilde yapmanın bir yolu var mı?


64
Bir www (veya başka bir alt alan adı) kullanmıyorsanız, tüm çerezlerin her alt alan adına gönderileceğini ve statik içeriğin sunulması için çerezsiz bir alt alan adının bulunamayacağını ve tarayıcı ve sunucu arasında ileri ve geri gönderilen veri miktarı. Daha sonra pişman olabileceğiniz bir şey: twitter.com/codinghorror/statuses/1637428313
Sam Hasler

3
Göz önünde bulundurulması gereken başka bir şey, olası bir yinelenen içerik cezasından kaçınmak için sayfalarınızda www olmadan kurallı adı ayarladığınızdan emin olun. Ayrıca bağlantılarınızda mutlak URL'leriniz varsa bunların hepsinin www olmayanlardan da emin olun.
Jeremy Morgan

Aklımda, özellikle farklı bir ayar gerektirebilecek (özellikle bazı durumlarda www alan adı daha iyi) weboptimizer.ch/2014/01/redirection-www
kar tanesi

Bu çözümün kök URL dışındaki tüm durumlar için işe yaramasının bir nedeni var mı? Örneğin domain.com does not piont için domain.com oysa domain.com/page1 için yönlendirme yapar domain.com/page1 .
Jeff Solomon

Protokolü (HTTP veya HTTPS) korurken
www'yi

Yanıtlar:


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

Bunun dışında Michael'ınkiyle aynı : P


16
Eğer işe yaramazsa, çalışmasını sağlamak için muhtemelen RewriteEngine Onöncüyü kaçırıyorsunuzdur .
hendry

8
@Ben, www olmayan bir web sitesine www eklemek için bunu nasıl tersine kullanabilirim ?
anarkhos

18
O yönlendirir http://www.domain.com/için http://domain.com//. Sen eklemek gerekir /için RewruteRule. Bu benim için çalışıyor RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov

13
http://domain.com//Çift eğik çizgilerle yönlendirme yaparak Vladimir ile aynı sorunu yaşıyordum . Bu yüzden yaptım RewriteRule ^(.*)$ http://%1$1 [R=301,L] ve şu ana kadar çalışıyor gibi görünüyor
bobfet1

5
Lütfen motoru yeniden yazmak yerine aşağıdaki çözümü kullanın, zarifken çok daha hızlıdır: stackoverflow.com/questions/1100343/…
Birla

111

Ancak bunu ayrı http ve https için yapmamız gerekiyorsa:

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

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

2
www.example.com/ example.com// adresine yönlendirir. Ek eğik çizgiyi kaldırmanın herhangi bir yolu var mı?
Bobby S

İyi soru. Hızlı çözüm, yukarıda açıklananlardan önce ek kurallar (yani sadece bu durum için) kullanmak olacaktır. Örn: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron

3
@BobbyS Bu makalede çözümü kullandım . Www ve HTTP'yi www olmayan HTTPS'ye yönlendirir ve aynı zamanda izlemeyi işler /.
totymedli

Bu yönergeleri doğrudan sunucu yapılandırmasına (veya sanal ana bilgisayara) yerleştirirseniz, yalnızca (URL yolunun başlangıcında) fazladan bir eğik çizgi elde edersiniz. İçinde .htaccessfazladan bir eğik çizgi olmamalı. (Bu yapılandırmayı sunucu yapılandırmasında gerçekleştiriyorsanız, muhtemelen başlamak için mod_rewrite kullanmamalısınız ... Redirectuygun vhost kapsayıcısında basit bir mod_alias daha verimli ve hataya daha az eğilimli olacaktır.)
MrWhite

72

Yeniden yönlendirme olmayan www için www (her ikisi: http + https)

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

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

4
@nightcoder Bunun nedeni, Andron'un aksine ters yönlendirme (www olmayandan www'ye) çözümüm
Dmitriy

2
Not: Alt alan adlarını başka amaçlar için kullanmayı düşünüyorsanız bu çözüm bazı sorunlara neden olabilir. Örneğin, alanadiniz.com.tr www.app.alanadiniz.com.tr adresine yönlendirilecektir.
Marty ZHANG

1
Bu, sorunun cevabının tam tersidir.
John

Eklemek zorunda kaldım RewriteEngine Onve RewriteBase /başka türlü iyi çalıştı.
overthink


33

Bir www URL'sini no-www adresine yönlendirmek için kurallar şunlardır:

#########################
# redirect www to no-www
#########################

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

Www olmayan bir URL'yi www'ye yönlendirmek için kurallar şunlardır:

#########################
# redirect no-www to www
#########################

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

NEApache'nin sorgu dizesinden kaçmasını önlemek için flag kullandığımı unutmayın . Bu bayrak olmadan, apache istenen URL'yi değiştirir http://www.example.com/?foo%20bariçinhttp://www.example.com/?foo%2250bar


1
http'yi https'ye https'ye yönlendirmek için kod yazabilir ve www'i www olmayan yönlendirmeye yönlendirebilirsiniz
HYDER ALI

Değiştiğinde HTTPS'ye zorlamak için http: // öğesini https: // olarak değiştirin. Ayrıca, bu kurallar tarafından yönlendirilmeyen trafik için düzenli bir http-> https yönlendirmesi eklemek istersiniz.
diamondsea

11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

RewriteCondYakalar her şeyi HTTP_HOSTdeğişkeni sonrawww. ve onu kaydeder %1.

RewriteRuleYakalar lider olmadan URL /ve bunu kaydeder $1.


1
sans leading "/"- İçinde .htaccess(soruda belirtildiği gibi) lider yoktur /, bu yüzden desen asla eşleşmez ve yönlendirme asla gerçekleşmez. (Bir sunucuda veya sanal ana bilgisayar bağlamında yalnızca önde gelen bir eğik çizgi vardır .) Ayrıca, bundan sonra mod_rewrite yönergeleriniz varsa Lbayrağa ihtiyacınız olacaktır .
MrWhite

7

Bunu dene:

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

Ana makine www ile başlıyorsa, tüm ana makineyi URL'nin başına yapıştırırız, ardından "www" yi çıkarırız.


1
RoBorg, maalesef ayarlarınız çalışmıyor, eğer bunu denersem: example.com/hello/world Burada bitiriyorum : example.com/hello/world/world Ayrıca% {HTTP_POST} 'dan sonra eğik çizgi eklemek zorunda kaldım. First RewriteRule
Deepwell

2
Apache / 2.2.9 (Unix) kullanıyorum. : Bu web Ama Aşağıdakiler için hangi yönlendirmeleri, www.website için çalışan web sitesi / testi : gider> - websitetest Başka / İkinci hatayı ekleyerek bu sabit: Web sitesi / test / n gider websitetest / n / n
derin bölmeli

1
Bu konuda @deepwell ile aynı sorun.
neemzy

Önceki okuyucuların yaşadığı sorunlar, bu yönergelerin sunucu yapılandırması (veya vhost) için tasarlanmış olması değil .htaccess. Bir dizin bağlamında ( .htaccess) ilk RewriteRuleokunan değeri değiştirmeniz gerekir : RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](Apache 2.2.12+ gerektirir). DPIURL yolunun bir kısmının daha önceki yorumlarda belirtildiği gibi çoğaltılmasını (aslında "yol bilgisi") önlemek için eğik çizgi ve (Yol Bilgisini Sil) bayrağının eklenmesine dikkat edin . Bununla birlikte, diğer cevaplarda ele alındığı gibi daha basit yönergeler vardır.
MrWhite

7

Komple Genel WWW işleyici, http / https

Tam bir cevap görmedim. WWW içerme işleminde bunu kullanıyorum.

  1. Jenerik. Alan bilgisi gerektirmez.
  2. Birinci etki alanındaki WWW'yi zorlar: www.domain.com
  3. Alt alanlardaki WWW'yi kaldırır: sub.domain.com
  4. HTTP / HTTPS durumunu korur.
  5. Alan adı / alt alan adları için ayrı çerezlere izin verir

Lütfen bunun nasıl çalıştığını veya bir boşluk bıraktığımı bildirin.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

Orijinal soru, wwwolmayan öğeye yönlendirmeyi ister www. Sen de dahil edilmeye zorluyorsun www.
Vadim

6

Htaccess yönlendirmeleri hakkında çok fazla yanlış bilgi olabilir. Öncelikle, bu kodun çalışmasını bekliyorsanız, sitenizin bir Windows ana bilgisayarında değil, Apache kullanarak Unix üzerinde çalıştığından emin olun.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(Yine de, her metin satırı arasında satır boşluğu olmadığından emin olun; Satırlar arasına fazladan bir boşluk ekledim, bu yüzden bu pencerede iyi oluyor.)

Bu, sitenizin www sürümünü http: // sürümüne yönlendirmek için kullanılabilecek bir kod snippet'idir. Kullanılabilecek başka benzer kodlar da vardır.


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

Alt klasör için


3

'Www' öneki OLMADAN sitenin tamamına erişmesi gerekenler için .

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Mare bunu aşağıdaki dosyaya eklediğinizden emin olun

/site/location/.htaccess 

Bu örnek tam değil - protosslortam değişkenini ayarlamıyorsunuz (bu standart / sunucu değişkeni değil). Bu her zaman boş olur, bu yüzden her zaman yönlendirilir http. ( protosslhttps
Kodda

3

Www veya www olmayanlara yönlendirmek için .htaccess kullanma:

Aşağıdaki kod satırlarını ana kök .htaccess dosyanıza koymanız yeterlidir. Her iki durumda da domain.com'u kendi ana makine adınızla değiştirin.

Www adresine yönlendir

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Www olmayan öğeye yönlendir

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

DOT değerini => olarak değiştirin. !!!


2

Yukarıdaki kuralı www olmayan www'ye fwd için kullandım ve ana sayfa için iyi çalışıyor, ancak /index.php'ye yönlendirdikleri iç sayfalarda

Bu başka kuralı buna neden olan ama bu konuda ne yapacağımdan emin olmayan .htaccess dosyamda buldum. Herhangi bir öneri harika olurdu:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

Alıntı yapmadan önce www olmayan yönlendirme kurallarını yerleştirmeniz gerekir.
Vladimir Jovanović

2

https ile www olmayan www

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Kaldırmak istediğiniz takdirde wwwhem httpve httpsaşağıdakileri kullanın:

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

Bu, SSL olmayan yönlendirmeleri

için

Ve SSL

için

apache üzerinde 2.4.*bu bir komutla sağlayabilirsiniz Redirectile ifdirektifi,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

2

kullanım: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Veya .htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

ve PHP yöntemi:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

1

Çalışabilmemin tek yolu ...

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

1

Zorluyorsanız www. url'de veya ssl protokolünde zorlayarak, htaccess dosyasında olası varyasyonları kullanmayı deneyin, örneğin:

Motor Açık
RewriteBase /

### WWW'yi zorla ###

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

## SSL'yi zorla ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## IP'leri engelle ###
Sipariş Reddi, İzin Ver
256.251.0.139'dan reddet
199.127.0.259'dan reddet

Apache başka bir bağlantı noktasını dinleyebilir, örneğin 81. Bu yüzden bunun yerine RewriteCond %{SERVER_PORT} 80daha evrensel bir kontrol kullanmanızı öneririm:RewriteCond %{HTTPS} off
Andron

1

Seçilen cevap ve diğer pek çok çözüm burada / sonra url kısmını düştü, bu yüzden temelde her zaman ana etki alanına, en azından benim için yeniden yönlendirdi .. Yani ben eğik çizgi sonra tam yol saygı saygı çalışma örnek ekliyorum ..

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

1

.Htaccess özelleştirmesi ideal bir seçenek değilse alternatif yaklaşım:

Genel kullanım için basit yönlendirme sunucusu oluşturdum. A veya CNAME kaydını eklemeniz yeterlidir:

CNAME   r.simpleredirect.net
A       89.221.218.22

Daha fazla bilgi: https://simpleredirect.net


0

Neden u kaldırmak istediğinizden emin değilim. Ancak ters sürüm:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

Ve bu betiğin avantajı şudur: u test.whattimein.com veya başka bir şey varsa (geliştirme / test etme çevresi) U'yu orijinal çevreye yönlendirmez.


2
Www alt alan adının dahil edilip edilmeyeceği gerçekten kişisel bir tercih meselesidir ve alan adına ve hedef kitleye bağlı olabilir. Www'yi none-www'ye yönlendirmek için yukarıda yayınlanan genel kod ayrıca test ortamlarını da işler, çünkü yönlendirme yalnızca "www" olduğunda gerçekleşir. alt alan adı ile karşılaşıldı.
MrWhite

1
Bu soru kullanıcının sorduğu soruların tersini yapar, ki bu sadece yayını kirletir.
Vadim

0

Bu, Apache 2.4 üzerinde çalışacak şekilde güncellenmiştir:

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

Michael's vs tek değişiklik [NC]"AH00665" hatası üreten kaldırmaktır :

Normal olmayan desen '-f' için NoCase seçeneği desteklenmez ve yok sayılır


Önceki yanıtın "Apache 2.4 üzerinde çalışacak şekilde güncellenmesi" gerekmiyordu. Alıntı yaptığınız "uyarı" (AH00665) farklı bir yönerge ile ilgilidir (örneğin, böyle bir şeye sahipseniz RewriteCond %{REQUEST_FILENAME} !-f [NC]). NCBayraklar Ancak nedenle çok az fark yaratır NCbayrak gerekir kullanılacaktır (yanlış) bir büyük ana bilgisayar adını gönderir bot trafik küçük bir kısmını yakalamak.
MrWhite

0

Localhost ise, yeniden yönlendirmeyi yoksay (yerel ortamda geliştirme amacıyla). Localhost VE değilse (https VEYA www değil), https ve www olmayanlara yönlendirin.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Lütfen OP'nizin soruyu nasıl yanıtladığını anlaması için kodunuzu hazırlayın.
RyanNerd

-2

Merhaba, htaccess dosyanızda aşağıdaki kuralları kullanabilirsiniz:

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

Soru, alan adını içermeyen "genel" bir çözüm istemektir. Çözümünüz ayrıca açıklamada sorulmayan soruların tam tersini de yapar (www yerine www yerine www olmayan) www.
MrWhite
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.