Www olmayanları .htaccess içindeki www'ye yönlendir


189

Bu benim .htaccess dosyamda var:

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

ancak kökümdeki bir dosyaya her eriştiğimde http://example.com/robots.txtyeniden yönlendirir http://www.example.comrobots.txt/.

Doğru şekilde yönlendirilmesi için bunu nasıl düzeltebilirim http://www.example.com/robots.txt?

Yanıtlar:


391

Yapılandırmanızı bu şekilde değiştirin (eğik çizgi ekleyin):

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

Veya aşağıda özetlenen çözüm ( @absiddiqueLive tarafından önerilen ) herhangi bir alan için işe yarayacaktır:

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

Http ve https'yi desteklemeniz ve protokol seçimini korumanız gerekiyorsa aşağıdakileri deneyin:

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

Nerede değiştirmek loginile checkout.phpsize HTTPS desteği gerekiyor ya da her türlü URL.

Bunun kötü bir fikir olduğunu iddia ediyorum. Gerekçe için lütfen bu cevabı okuyun .


Bazı sayfalar (giriş veya kayıt gibi) https protokolünü kullandığında bu çözüm çalışmaz.
Alexey Kosov

Bazı bilgileri içermek için yayını biraz güncelledim. Kullanılacak protokolü hem genel hem de doğru bir şekilde seçmek zordur.
Randall Hunt

3
İlk çözüm yeterince yönlendirmiyor, 2. çözüm çok fazla yönlendiriyor gibi görünüyor. Örneğin, blog.example.comolurwww.blog.example.com
gman

Ayrıca localhost üzerinde geliştirirken yönlendirmeyi nasıl önleyeceğinizi de ekleyebilir misiniz?
Bugs Bunny

Burada her şeyi takip ediyorum ama hiçbir şey çalışmıyor. Ben laravel kurulumu kullanıyorum. Bunun neden benim için çalışmadığına dair bir fikri olan var mı? www.domain.com ve domain.com her ikisi de düzgün şekilde yüklenir, ancak domain.com www.domain.com adresine yönlendirmez. Bu benim DNS ile ilgili bir sorun olabilir mi?
merhaba dünya

93

İşte https ve http'yi destekleyen doğru çözüm:

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

7
Bu mükemmeldir, alt etki alanlarını wwwdiğer genel çözümlerin yaptığı gibi yönlendirmez .
Fabian Schmengler

4
Bu en iyi çözümdür, kabul edilen yanıttan çok daha iyi çalışır ve HTTPS'yi düzgün şekilde
halleder

3
Mükemmel çalışıyor! Ve bu kadar az satırda!
zeckdude

8
BU EN İYİ CEVAP
Andrew

8
Yanılmıyorsam, bu birden fazla nokta için işe yaramaz. Örnekler:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Https için

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

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

7
Bu çözüm @ ranman için tercih edilir, çünkü yeni bir proje için kod uygularken veya mevcut bir projeye fazladan etki alanı uyguladığınızda insan hatasını en aza indirir.
Frankie

Bu çözümü tercih ederim ama neden ^(.*)$yerine (.*)?
Popnoodles

Bu çözüm daha iyi ama ben de seninkini de kapsayacak şekilde benimkini düzenledim.
Randall Hunt

1
Bu, tüm etki alanı için basit ve etkili çalışıyor! Eyvallah
eirenaios

% {HTTPS} sn ^ tarihinde RewriteCond'u takip edebilirsiniz | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
eksik

24

Aşağıdaki örnekte her iki çalışır ssl ve olmayan SSL ve yönetmek sadece bir kural olarak kullanmak çok daha hızlıdır http ve https

RewriteEngine on


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

[Test]

Bu yönlendirecek

http

için

https

için


1
Ben geldi ne çok yakın. HTTP ana bilgisayarında birden fazla noktayı da destekler, örneğin "mysite.co.uk".
Adambean

2
Sadece meraktan, neden burada R = 301 kullanmıyorsun? Kod belirtilmezse varsayılan olarak 302 (taşınan sıcaklık) kullanır.
Marc

1
Mükemmel çalışıyor. Bu kabul edilen cevap olmalı.
James Nisbet

8

Bunu deneyin, birçok web sitesinde kullandım, mükemmel çalışıyor

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

4

Yukarıdaki tüm çözümleri test ettim ama benim için çalışmıyor, http: // kaldırmaya çalıştım ve ayrıca yeniden yönlendirilmemesi de iyi yönlendirilmiyor. : //

Bu yüzden birlikte bazı kodları birleştirdik ve hem http: // hem de https: // ve www ve www olmayanlar için mükemmel bir çözüm ortaya çıktı.

# 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>

Umarım bu birine yardımcı olabilir :)



3

Bu yapılandırma benim için yapılandırılmış SSL ile bitnami wordpress'te çalıştı:

/Opt/bitnami/apps/wordpress/conf/httpd-app.conf dosyasındaki "RewriteEngine On" altına aşağıdakiler eklendi

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]

Bu WWW ile başlatılmayan alan adınızı yönlendirecektir. Tüm alt alan adınızı yönlendirmez.

Bu kullanışlı.


2

En iyi yanıtın www olmayanları başarıyla www'ye yönlendirdiğine inanıyorum (ör: sitem.com -> www.mysite.com ), ancak joker karakter alt alanlarını hesaba katmaz, sonuç:

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

İşte HTTPS ile / HTTPS olmadan bir çözüm

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]

* Not: Http test etmedim çünkü şu anda test etmek için bir sertifikam yok, ancak birileri sahip olduğumu doğrulayabilir veya optimize edebilirse bu harika olurdu.


İlk $ burada ne yapar: '^ (. *) $'
Vaishal Patel

0

Mümkünse bunu ana Apache yapılandırma dosyasına ekleyin. Daha hafif bir çözümdür, daha az işlem gerektirir.

<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

Böylece, VirtualHost"example.com" için ayrı olan bu istekleri yakalar ve ardından kalıcı olarak ana sitenize yönlendirirVirtualHost . Bu nedenle, her istekle REGEX ayrıştırma işlemi gerçekleştirilmez ve istemci tarayıcılarınız yeniden yönlendirmeyi önbelleğe alır, böylece "yanlış" URL'yi bir daha asla (veya nadiren) istemez ve sizi sunucu yükünden kurtarır.

Dikkat, sondaki eğik çizgi Redirect permanent / http://www.example.com/. Bu olmadan, example.com/asdfyönlendirme http://www.example.comasdfyerine yerine yönlendirme yapar http://www.example.com/asdf.


0

İki uyarı

301'den kaçının ve modern 303 veya 307 yanıt durum kodlarını tercih edin.

301'den kaçının

Belirtilen kalıcı yönlendirmeye gerçekten ihtiyacınız varsa dikkatlice düşünün, [R=301]çünkü daha sonra değiştirmeye karar verirseniz, sayfanın önceki ziyaretçileri orijinal yönlendirme sayfasını görmeye devam eder.

Kalıcı yeniden yönlendirme bilgileri genellikle tarayıcının önbelleğinde depolanır ve genel olarak ortadan kaldırılması zordur (sayfayı yeniden yüklemek sorunu çözmez). Web sitenizin ziyaretçileri önceki yönlendirmeye "sonsuza kadar" takılmış olacak.

302'den de kaçının

HTTP protokolünün (v1.1) yeni sürümü, 302 yerine kullanılabilecek iki yeni yanıt durum kodu ekledi.

  • 303 URL yönlendirmesi, ancak istek türünün GET olarak değiştirilmesi isteniyor.
  • 307 URL Yeniden Yönlendirme ancak istek türünün başlangıçta gönderildiği gibi tutulmasını istiyor.

302Belirsiz olarak değerlendirilmesine rağmen , kodu (kalıcı olmayan yeniden yönlendirme) kullanmaya devam edebilirsiniz . Her durumda, çoğu tarayıcı 302yeni 303kodun talimat verdiği gibi uygular .


301 ile ilgili uyarınızla ilgili olarak, aynı alan adından bahsediyor olsak bile bu geçerli olacak mı? o kadar emin, bu durumda ne şekilde uygulanacağı ... tüm URL yönlendirme geliyor http://example.com/testingiçin http://www.example.com/testing. Uzun vadede kötü bir yaklaşım olabilir mi? Teşekkürler,
Sara_

-1

.Htaccess yazınız :)

## 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
Diğer cevaplarla aynı
Ankit
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.