https: // www adresine htaccess yönlendirmesi


309

Aşağıdaki htaccess kodu var:

<IfModule mod_rewrite.c>

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

</IfModule>

Sitemin https://www.HTTPS ile yönlendirilmesini ve www.alt alan adını zorunlu kılmasını istiyorum, ancak http://www.(HTTPS olmadan) eriştiğimde beni https://wwwHTTPS ile yönlendirmiyor .


OlmalıRewriteCond %{HTTPS} =off
Michael Berkowski

1
Bunu yaparsam https: / / ww ww w w'ye
bigben

Sevgili @bigben burada yanlış bir cevap kabul ettiniz! Benim de neden onun yanlış öğrenebilirsiniz cevap .
Amir Fo

Yanıtlar:


632

HTTPS'yi ilk kez zorlamak için doğru ortam değişkenini kontrol etmelisiniz %{HTTPS} off, ancak yukarıdaki www.kuralınız uygulamak için ikinci bir kuralınız olduğundan www., ilk kuralda kullanmayın.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Proxy hakkında

İstemcinin bir proxy, yük dengeleyici, Yolcu uygulaması vb. İle HTTPS üzerinden bağlandığı bazı proxy formlarının arkasındayken, %{HTTPS}değişken asla onyeniden yazma döngüsüne neden olmayabilir . Bunun nedeni, istemci ve proxy / yük dengeleyici HTTPS kullanıyor olsa bile uygulamanızın aslında düz HTTP trafiği almasıdır. Bu durumlarda, değişken X-Forwarded-Protoyerine başlığı kontrol edin %{HTTPS}. Bu cevap uygun süreci göstermektedir


14
Bazı durumlarda sertifikanız yalnızca tek bir alan için iyi olabilir (örneğin www ile çalışabilir, ancak bunlar olmadan çalışamaz). Bu gibi durumlarda, önce doğru etki alanına, ardından https'ye yönlendirin, aksi takdirde tarayıcınızda bir cert hata mesajı alırsınız.
Nick Benson

19
Ben kullanıldığında RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]gibi bir URL exaple.com/?bla=%20 oldu exaple.com/?bla=%2520 , yani yüzde işareti kodlanmış. NEÇift kodlamayı önlemek için bayrağı kullanmayı düşünün :RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
yendi

5
Bu bana bir sunucuda bir yönlendirme döngüsü verir, diğer sunucuda çalışır. gerçekten neden bilmiyorum
user151496

4
@ user151496 Başarısız olan sunucu, Vernik önbellekten veya Yolcu'ya geçmek gibi herhangi bir HTTP proxy kullanıyor mu? Öyleyse X-Forwarded-Proto, %{HTTPS}değişken yerine HTTPS'yi doğrulamak için başlığı kontrol etmeniz gerekebilir . Hangi parçanın döngüye, wwwHTTPS parçasına neden olduğunu söylemediniz , ama bu benim için akla ilk gelen şey.
Michael Berkowski

5
Kesinlikle söylemek gerekirse, yukarıdaki iki kural yanlış sırada. http://example.com(HTTP ve www olmayan) için bir istek gelirse, çift ​​yönlendirme alırsınız. Önce https://example.com(ilk kural) sonra da https://www.example.com(ikinci kural). Her iki kural da HTTPS'ye yönlendirmeksizin, bu iki kuralı tersine çevirerek bunu düzeltebilirsiniz.
MrWhite

148

Michals cevabı benim için çalıştı, ancak küçük bir değişiklikle:

Sorun:

Eğer bir olduğunda tek bir site güvenlik sertifikası : // www çalışır https olmadan sayfasına erişmek için bu, bir tarayıcı. (veya sertifikanızın kapsadığı alan), daha önce çirkin kırmızı bir uyarı ekranı görüntüler , güvenli ve doğru https sayfasına yönlendirmeyi bile .

Çözüm

İlk olarak www (veya sertifikanızın kapsadığı alan) yönlendirmesini kullanın ve yalnızca https yönlendirmesini yapın. Bu, tarayıcınız mevcut URL'yi kapsamıyor bir sertifika gördüğünden, kullanıcılarınızın herhangi bir hatayla karşılaşmamasını sağlar.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

5
+1 çünkü bu senaryo için daha iyi bir seçenektir, ancak bu, istemci erişirse aynı sorunun oluşmasını engellemeyeceğini https://example.com, ancak bence bu bir kullanıcı tarafından yazılması en az olası biçimdir. (Kabul edilen cevap aynı soruna da sahip olacaktır)
Joshua Goossen

@Larzan: Bu yanlış. Sertifika istisnası yalnızca 2 gerçek yönlendirme yaptığınızdan oluşur. "[L, R = 301]" yerine "[R = 301]" yazın. Kurallar iptal edilmez. L = SON
defim

Yalnızca üzerinde bir sertifikaya sahip https://olmadan işlem yapmanız gerekiyorsa , bu kuralı çözüme eklemeniz yeterlidir: Sertifika hatasını önlemek için bağlanmaya çalıştığınızda geri döner . wwwwwwRewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]httphttps://example.com
Eric Burel

1
http://example.com
İstendiğinde

@EricBurel Bu örnekte sertifika hatasını önleyemezsiniz - SSL el sıkışması kodunuz yürütülmeden önce gerçekleşir (bu, ilk etapta SSL'nin bütün noktasıdır). Yönlendirmeniz, tarayıcılar sertifikası hatasından önce çalışabildiyse, isteğin zaten güvenli olmayan bir bağlantı üzerinden yapılmış olduğu anlamına gelir - bu, SSL modelinde temel bir başarısızlık olacaktır.
MrWhite

99

CloudFlare veya benzeri bir CDN kullanıyorsanız, burada sağlanan% {HTTPS} çözümleriyle sonsuz bir döngü hatası alırsınız. Bir CloudFlare kullanıcısıysanız, bunu kullanmanız gerekir:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
Lütfen Cloudflare destek sitesindeki mevcut tavsiyenin biraz farklı olduğunu unutmayın: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott

1
@ H0mayun ile hemfikir olun, Cloudflare tavsiyesi bir yönlendirme döngüsünde sonuç verirken, buradaki kod mükemmel çalışır - teşekkürler!
Mart'ta hobailey

2
Ec2 üzerinde angularjs çalıştırıyorum. RewriteCond% {HTTPS}! = Kullanan çözümler bana sonsuz yönlendirme sağlıyor (neden tam olarak emin değilim). X-Forwarded-Proto ile bu çözüm işe yarıyor gibi görünüyor. Teşekkür ederim!
Mark Watkins

3
Ben modifiye =httpetmek !=httpsbizim ortamlar için. X-Forwarded-Protobaşlık http ise, !=httpshile de ilan edilmedi .
Johnathan Elmore

Bu içgörü için teşekkürler! Neden {HTTPS}işe yaramadığını anlamaya çalışmak için saatler harcadım . Denedim {ENV:HTTPS}ve hatta {SERVER_PORT} 443, ama sonunda Cloudflare'ın özel HTTP istek başlıklarını kontrol etmem gerekti.
camslice

56

KÖTÜ ÇÖZÜM VE NEDEN!

Aşağıdaki çözümü asla kullanmayın çünkü kodlarını kullandığınızda şuna benzer:

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

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

Tarayıcı şuraya gider:

http://example.com

Ardından şuraya yönlendirir:

https://example.com

Ardından şuraya yönlendirir:

https://www.example.com

Bu çok fazla istek sunucuya .

Kabul edilen cevapların çoğunda bile bu sorun var.


EN İYİ ÇÖZÜM VE CEVAP

Bu kod, [OR]url'de ikili değişiklikleri önlemek için bir koşula sahiptir !

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

3
"KÖTÜ ÇÖZÜM VE NEDEN!" - Bu kurallar sadece yanlış sırada. Bu iki kuralı tersine çevirdiğinizde doğru olacaktır - iki değil, yalnızca bir yönlendirme alırsınız.
MrWhite

4
Evet, kod verilen 2 yönlendirmelerde sonuçlanır - ben itiraz etmiyorum - tüm söylüyorum sadece bu sorunu çözmek için bu kuralları tersine çevirmek gerekir, başka bir değişiklik gerekli değildir. ("Kabul edilen" cevap gerçekten yanlıştır - kastettiğiniz gibi görünüyor - yönergeler yanlış sırada.)
MrWhite

1
yup @AmirForsati haklı. iki kez yönlendiriyor ve bu kabul edilen cevap olmalı.
Zakir hussain

4
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Etki alanı

Bu beni yönlendiriyor wp-content/cache/page_enhanced/ve sonra devam ediyor. Bunu nasıl düzeltebilirim? Edit: Görünüşe göre üstünde koymak gerekir .htaccess. Senaryo için teşekkürler :)
Giacomo

35

Proxy kullanıcıları için değil, Proxy için bulduğum en iyi yol budur

RewriteEngine On

### START WWW & HTTPS

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

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
Doğru Bu, proxy kullanıcıları için değil, proxy kullanıcıları için bulduğum en iyi yoldur +1
Deep 3015

1
Birden fazla 301 yönlendirmesini çözdüğü için bu en iyisi
Niraj Chauhan

1
şimdiye kadarki en iyi çözüm.
SM Jobayer Alam

1
Mükemmel cevap. Benim için çalışan tek kişi bu. Cloudflare'nin arkasındaysanız çalışır (ancak Cloudflare'de ayarlanmış sayfa kuralım yok).
jasonco

Tüm davalarımda çalışan tek çözüm. Ama ne de oposite yapmak ve tüm "www" kaldırmak istiyorum.
FedeKrum

27

Orada birçok çözüm var. İşte bu konuyla doğrudan ilgilenen apache wiki'ye bir bağlantı.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

Yeniden yazma koşulunu bu yönlendirmeye her zaman olacak RewriteCond %{HTTPS} offşekilde değiştirerek buldum RewriteCond %{HTTPS} !=on, bu bana daha iyi bir yanıt gibi görünüyor.
Samuel Hawksby-Robinson

Bu çözüm doğru bir cevap olarak kabul edilmelidir! Benim için de çalıştı!
AndrewShmig

11

Http: // veya https: // ' yi https: // www adresine yönlendirmek için apache'nin tüm sürümlerinde aşağıdaki kuralı kullanabilirsiniz:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

% {REQUEST_SCHEME} değişken apache'nin itibaren kullanıma hazır olduğuna dikkat 2.4 .


1
Sorun !: HTTP_HOST zaten www içeriyorsa. ancak şema HTTPS değildir, o zaman www.www ile sonuçlanırsınız. sunucunuzda.
Jpsy

@Jpsy haklısın. Yönlendirme hedefini güncelledim. Girdiniz için teşekkürler.
starkeen

1
Bu neredeyse aradığım şeydi, ancak diğer örneklerde olduğu gibi alan adını genel tutmak istiyorum. Mümkün mü?
cronoklee

8

CloudFlare kullanıyorsanız, böyle bir şey kullandığınızdan emin olun.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

Bu sizi yönlendirme döngüsünden koruyacak ve sitenizi güvenli bir şekilde SSL'ye yönlendirecektir.

PS mod_rewrite.c kontrol etmek için iyi bir fikirdir!


https: // theurlwithoutwww.com adresini https: // www adresine yönlendirmez.
thesearentthedroids

Bu aslında sadece bazı "www ekle" direktifleriniz varsa çalışan bir çözümdür. Diğer çözümler bana "birçok yönlendirmeye" veriyor.
Daniel .P.


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

Notlar: Aşağıdaki adımları uyguladığınızdan emin olun

  1. sudo a2enmod yeniden yazma
  2. sudo service apache2 yeniden başlatma
  3. /Etc/apache2/sites-available/000-default.conf adresinde bulunan vhost dosyanıza aşağıdakileri ekleyin
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Şimdi .htaccess'iniz çalışacak ve siteniz http: // yönüne https: // www adresine yönlendirilecek


1

Amir Forsati'nin https: // www çözüm htaccess yönlendirmesine benzer, ancak değişken alan adı için şunu öneririm:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]

0

.Htaccess dosyanızda ayarlayın

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


-2

İlk cevabı deniyorum ve işe yaramıyor ... Bu iş:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
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.