www olmayandan www'ye apache yönlendirmesi


206

Ben www olmayan www www yönlendirme gibi görünmüyor bir web sitem var.

Apache yapılandırmam aşağıdaki gibidir:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Neyi kaçırıyorum?


1
Bir İçin .htaccess: tabanlı bir çözüm ben çaptan soru üzerine yöneltilen edilmiş bir soruya ancak stackoverflow.com/a/5262044/367456
hakre

bu iyi, url'ye bir eğik çizgi ekliyor, bu yüzden dolar önce eğik çizgi kaybetmek.
wuxmedia

Yanıtlar:


510

Yeniden yazma motorunu kullanmak, bu sorunu çözmenin oldukça ağır bir yoludur. İşte daha basit bir çözüm:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Ve sonra gerçek sunucu yapılandırmanız için başka bir <VirtualHost>bölümünüz olacak ServerName www.example.com. Apache /, Redirectyönergeyi kullandıktan sonra herhangi bir şeyi otomatik olarak korur ; bu, bu yöntemin neden çalışmadığına (aslında işe yaradığına) dair yaygın bir yanlış anlamadır.


20
SSL sanal konakına sahip bir site için nasıl yapıyorsunuz?
Shabbyrobe

28
Bu öneriyi kullanırken "example.com adresindeki web sayfası çok fazla yönlendirmeye neden oldu" hatasını alıyorum. Başkalarının bu sorunu var mı?
Jonathan Berger

4
@BlackDivine: Diğer yönde yapmanın büyülü bir yanı yok. Sadece www.exampleve examplenumunede göründükleri her yerde değiştirin .
Greg Hewgill

11
@JonathanBerger Çok fazla yönlendirmeniz varsa, dosyayı muhtemelen iyi yapılandırmamışsınız demektir. 2 VirtualHost'a sahip olduğunuzdan emin olun: biri yukarıda olmayan www olmayan, diğeri de gerçek yapılandırmaya sahip SunucuAdı www.example.com ile. Ayrıca www.example.com yapılandırmasında da yönlendirme yapmadığınızdan emin olun (hem mod_alias hem de mod_rewrite).
Savas Vedova

3
Sanal bir ana sunucu için, example.com deyin, ben var Redirect 301 / http://example2.com/extra/ama yönlendirdiği zaman, sondaki eğik çizgiyi özlüyor, yani example.com/blahgidiyor example2.com/extrablah. Herhangi bir fikir? (Apache 2.2.22)
Peter Howe

87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
çok kısa cevap ... ama puanlara ... bunun bir yukarı ya da aşağı oy olduğundan emin değilim
thecoshman

2
Ah bu düzgün, bu üst düzey sunucu yapılandırmasına dahil edilebilir (ve eğer öyleyse) her sanal ana bilgisayar için geçerli olacak!
thenickdude

Merhaba @burzumko www olmadan herkes için geçerli olan bu nasıl elde edersiniz, ama sonra, www olmadan geçelim diyelim example.com/subdi1/ws/* ?
black sensei

1
Bu çözümü HTTPS sanal ana bilgisayarları için de kullandım. sÜçüncü satıra http eklemek için .
rodrigoap

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Bu benim için işe yaramadı; aynı siteye sonsuz bir yönlendirme döngüsüne neden oldu
dmiller309

1
@ dmiller309: Eğer eklemiş olur musunuz www.içinde ServerAlias?
cherouvim

2
Haklısın, yanlışlıkla www koydum. * kullanarak ServerAlias ​​içinde. joker. Çünkü VirtualHost girişlerinin sırasını berbat ettim, *. wildcard, bunu düşünmediğim zaman eşleşme fırsatı buldu.
dmiller309

7
Bu en iyi cevaptır, çünkü temizdir, yolu tutar (cevap # 1'in aksine) ve Yeniden Yaz'ı kullanmaz.
schieferstapel

30

Kaldırmak için wwwsizin gelen URLweb senin bu kodu kullanmak .htaccessdosyanın:

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

wwwWeb sitenizi zorlamak URLiçin şu kodu kullanın:.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Nerede YourSite.comsizin ile değiştirilmelidir URL.


Birden fazla alan adına sahip web sitesi için <3
Clement Herreman

2
.Html ile ikinci bölüm ne için ??
Nathan H

6
Yeniden yönlendirme => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

Yukarıdaki kodda olan budur. İlk sanal ana bilgisayar bloğu, isteğin www.example.com olup olmadığını kontrol eder ve web sitenizi bu dizinde çalıştırır.

Başarısız olan, ikinci sanal ana bilgisayar bölümüne gelir. Burada www.example.com dışında bir şey www.example.com adresine yönlendirilir.

Buradaki düzen önemlidir. Önce ikinci sanal ana bilgisayar yönergesini eklerseniz, bir yönlendirme döngüsüne neden olur.

Bu çözüm, alan adınızdaki tüm istekleri www.alanadiniz.com.tr adresine yönlendirecektir.

Şerefe!


16

Bu, birkaç geliştirmeyle diğer önerilerin çoğuna benzer:

  • Alan adını sabit kodlamaya gerek yoktur (birden çok alan adını veya ortamlar arasında kabul eden vhost'larla çalışır)
  • Şemayı korur (http / https) ve önceki %{REQUEST_URI}kuralların etkilerini yok sayar .
  • Yol bölümünü, önceki etkilenmez RewriteRulegibi s %{REQUEST_URI}almaktadır.

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

4
Neredeyse mükemmel. % {HTTP_HOST} $ 1 olmalı,% {HTTP_HOST} / $ 1 olmamalıdır (veya eğik çizgiyi iki katına
çıkarır

@Michael Wyraz: Buradaki eğik çizgiyi iki katına çıkarmıyor mu ?!
not2savvy

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

Bu HTTP_HOST, gelen URL'nin ( example.com) yalnızca alan adı bölümünü içeren değişkenle başlar . Alan adının a içermediği www.ve alan adınızla tam olarak eşleştiği varsayıldığında, RewriteRule devreye girer. Kalıp , HTTP isteğinde ( ) istenen kaynak olan ^(.*)$her şeyle eşleşir . Bunu, daha sonra URL'yi yeni alan adıyla (ile başlayan ) yeniden yazmak için kullanılan bir geri başvurusunda saklar .REQUEST_URIfoo/blah/index.htmlwww

[NC] büyük / küçük harfe duyarlı olmayan eşleşmeyi gösterir, [R=301] gösterir 301 kodunu (kaynak kalıcı olarak taşındı) kullanarak harici bir yönlendirmeyi belirtir ve [L]diğer tüm yeniden yazmaları durdurur ve hemen yeniden yönlendirir.


6

Hem www => www olmayan hem de www => www olmayanların tersine yönlendirme kodu. .Htaccess dosyasında sabit kodlama alanı ve şeması yok. Böylece başlangıç ​​etki alanı ve http / https sürümü korunur.

APACHE 2.4 VE YENİ

WWW OLMAYAN => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => WWW OLMAYAN:

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

Not:% {REQUEST_SCHEME} kullanılabilir olmadığı Apache 2.2'de çalışmaz. Apache 2.2 ile uyumluluk için aşağıdaki kodu kullanın veya% {REQUEST_SCHEME} yerine sabit http / https kullanın.


APACHE 2.2 VE YENİ

WWW OLMAYAN => WWW:

RewriteEngine On

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

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

... veya daha kısa versiyon ...

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

WWW => WWW OLMAYAN:

RewriteEngine On

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

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

...% N yalnızca son RewriteCond sürümünden kullanılabilir olduğu için daha kısa sürüm mümkün değil ...


Apache 2.4 yapılandırma sorunu çözdü, temiz cevap için teşekkürler .. !!
KimchiMan

5

Ben koştum ...

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

Bu yeni yönerge 25 + etki alanları için evrensel olması gerekir, bu nedenle bu yönerge bir <Directory> etiketindeki virtual.conf dosyasındadır. (dir tüm doktoraların üst öğesidir)

Http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html'nin söylediklerine rağmen, desen dokümanı üzerinde tam doktora taşındığı için yeniden yazma kuralında bir parça kesmek zorunda kaldım. hakkında sadece ana bilgisayar ve bağlantı noktası sonra şeyler olmak.


5

Apache 2.4 kullanıyorsanız, yeniden yazma apache modülünü etkinleştirmeye gerek kalmadan aşağıdaki gibi bir şey kullanabilirsiniz:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
Yetersiz cevap. Bunu kullanarak, otomatik Let'sEncrypt komut dosyaları için iyi olan ek sankonlardan kaçınılabilir.
Paul

Ayrıca, ANSIBLE kullanıyorsanız, ANSIBLE 2.0'dan beri artık bir görevdeki bir dosyaya kolayca bir blok ekleyebilirsiniz, daha fazla ayrıntı burada docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

Domain.tld dosyasını www.

Aşağıdaki satırlar Apache yönergelerine veya .htaccess dosyasına eklenebilir:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Diğer sudomainler hala çalışıyor.
  • Hatları ayarlamaya gerek yok. bunları doğru yere kopyalayıp yapıştırmanız yeterlidir.

Eğer hayaleti değiştirirseniz apache değişikliklerini uygulamayı unutmayın.

(varsayılan Drupal7 .htaccess'i temel alır, ancak birçok durumda çalışması gerekir)


3

Bu basit!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Bu yalnızca alan adını değil, aynı zamanda iç sayfaları da yönlendirir. Like ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


Bunun için teşekkürler. Çok yararlı.
Anthony

2

Bunu dene:

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

2

Her zaman kullanmayın Redirect permanent(veya neden gelecekte sorunlara neden olabileceğini)

Daha sonra alt alan adı ekleme şansınız varsa kullanmayın redirect permanent.

Çünkü bir istemci kaydedilmemiş bir alt alan kullandıysa, VirtualHostdaha sonra kaydedilmiş olsa bile bu alt alana asla ulaşamaz.

redirect permanent gönderir HTTP 301 Moved Permanentlyistemciye (tarayıcı) ve birçoğu bu yanıtı sonsuza kadar önbelleğe alır (önbellek [manuel olarak] temizlenene kadar). Bu nedenle, bu alt alanın kullanılması, sunucuyu tekrar istemeden her zaman www. *** 'ye otomatik olarak yönlendirilecektir.

bkz. Tarayıcılar HTTP 301'leri ne kadar süreyle önbelleğe alır?

Sadece kullan Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - mod_rewrite kullanılmadığında

Apache.org - Kurallı Ana Bilgisayar Adları


1

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

bu mükemmel işi kontrol et



0

Bu benim için çalışıyor:

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

Apache'de sonsuz bir yönlendirme döngüsünü önlemek için tüm etki alanlarını alt etki alanına yönlendirirken alt etki alanını (?!www.domain.com)hariç tutmak için ileriye bakma desenini kullanıyorum .wwwwww


0

Kullandığım kod:

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

0

-Birden fazla alan adı barındırıyorsanız (İsteğe bağlı)

-Tüm bu alan adları https kullanıyorsa (olması gerektiği gibi)

-Tüm alan adlarının www dot domainName kullanmasını istiyorsanız

Bu, iki yönlü yönlendirmeyi önler (http: // www olmayan: http: // www ve sonra https: // www)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

Ve

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

301 yönlendirme kodunu en uygun olana değiştirmelisiniz.


-1

<VirtualHost *:80>Farklı ServerNames ile iki blok yukarıdaki çözüm kullanıyorsanız ...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... sonra ayarlamalısınız NameVirtualHost Onde .

Bunu yapmazsanız, Apache ServerName, blokları ayırt etmek için farklı s'yi kullanmasına izin vermez , bu nedenle bu hata iletisini alırsınız:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... ve ya yeniden yönlendirme olmaz ya da ilk olarak hangi bloğa koyduğunuza bağlı olarak sonsuz bir yönlendirme döngünüz vardır.


-1

Yeniden yönlendirme kuralının (ağa ekleyeceğim herhangi bir etki alanı için) genel olması gereken bir WP Multisite'de benzer bir görevim vardı. Önce alana (park edilmiş alan) bir joker karakter ekleyerek çözüldü. Not edin. .com'dan sonra.

CNAME * domain.com.

Ve sonra, çoklu sitemin kökündeki .htaccess dosyasına aşağıdaki satırları ekledim. Sanırım herhangi bir site için işe yarar.

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

Umarım bu yardımcı olacaktır.

ps. Www'den www'ye yönlendirmek istiyorsanız, son satırı şu şekilde değiştirin:

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

-2

Birden fazla vhosts kullanırken ServerAlias ​​kullanmak daha kolay (ve daha yararlı) buldum.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Bu aynı zamanda https vhosts ile de çalışır.


Başka bir sürmek aşağı oy. Açıklamak ister misiniz, oh aşağı oyu açıklamak için rahatsız olamaz httpd güçlü tanrı?
Anthony

1
Bu, aynı siteyi barındıran birden fazla alanınızın olmasını sağlar. Durumlarınıza ve temel web sunucunuzun çalıştığına bağlı olarak, çerezleri aktarmama, insanların kafası karışması ve arama motoru sorunları (bunu 2 farklı site olarak göreceksiniz) ile ilgili sorunlar yaşayacaksınız.
Jeffrey Van Alstine
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.