.htaccess przekierowuje http na https


86

Mam stary adres URL ( www1.test.net) i chciałbym go przekierować na https://www1.test.net
Zaimplementowałem i zainstalowałem nasz certyfikat SSL na mojej stronie.
To jest mój stary plik .htaccess:

RewriteEngine On
RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L]
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]

Jak mogę skonfigurować mój .htaccessplik, aby automatycznie przekierowywać do adresu URL https?
Dzięki!


Jeśli w drugim wierszu nie ma przekierowania, jeśli ścieżka wskazuje na rzeczywisty plik (a podajesz oczekiwane możliwe rozszerzenia), możesz uczynić go bardziej elastycznym, zastępując go sprawdzaniem istniejącego pliku: RewriteCond %{REQUEST_FILENAME} !-f po którym następuje Twoje przekierowanie.
diamondsea

Odpowiedzi:


117

Aktualizacja 2016

Ponieważ ta odpowiedź przyciąga uwagę, chcę zasugerować bardziej zalecany sposób robienia tego za pomocą Virtual Hosts: Apache: Redirect SSL

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

Stara odpowiedź, hacky, biorąc pod uwagę, że twój port ssl nie jest ustawiony na 80, to zadziała:

RewriteEngine on

# force ssl
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Zauważ, że powinna to być twoja pierwsza reguła przepisywania.

Edycja: ten kod wykonuje następujące czynności. RewriteCond (ition) sprawdza, czy ServerPort żądania wynosi 80 (który jest domyślnym portem http, jeśli określono inny port, należy dostosować do niego warunek). Jeśli tak, dopasowujemy cały adres URL (.*)i przekierowujemy go na adres https-url. %{SERVER_NAME}można zastąpić określonym adresem URL, ale w ten sposób nie musisz zmieniać kodu dla innych projektów. %{REQUEST_URI}jest częścią adresu URL po TLD (domenie najwyższego poziomu), więc zostaniesz przekierowany do miejsca, z którego przyszedłeś, ale jako https.


1
Dzięki, dzięki ... to działa ...: D Ale czy możesz wyjaśnić, dlaczego to działa? ... dzięki ... ^^
Bàn Chân Trần

1
cieszę się, że to zadziałało. sprawdź zaktualizowaną odpowiedź, aby uzyskać wyjaśnienie dotyczące kodu. Czy to ci wystarczy?
Jojo

1
„Zauważ, że powinna to być Twoja pierwsza reguła przepisywania”. @Jojo Saved my life man: *
Ivan Shulev

1
Aby dodać do wyjaśnienia. „[Flaga [L]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l ) powoduje, że mod_rewrite przestaje przetwarzać zestaw reguł.” Zwykle chcesz to po prostu dodać domyślnie. „Użycie [flagi [R]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r ) powoduje wysłanie przekierowania HTTP do przeglądarki.” Jeśli go nie ma, przekierowanie będzie wewnętrzne, co unieważniłoby sens korzystania z protokołu HTTPS. Domyślnie wysłane przekierowanie ma stan 302 (przekierowanie tymczasowe). Jeśli chcesz, aby przeglądarka („na stałe”) buforowała nowy adres URL, użyj [R=301]zamiast tego.
Jānis Elmeris

1
W przypadku rozwiązania VirtualHost nie jest jasne, gdzie należy umieścić instrukcję „Redirect permanent” w przypadku skomplikowanej konfiguracji. Założyłem blisko szczytu i zadziałało.
eyal_katz

178

Aby pomyślnie przekierować wszystkie strony mojej domeny z http na https, używam:

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

Pamiętaj, że spowoduje to przekierowanie za pomocą 301 'permanently moved'przekierowania, które pomoże przenieść Twoje rankingi SEO.

Aby przekierować za pomocą 302 'temporarily moved'zmiany[R=302,L]


5
jest to bardziej odpowiednie niż „hacky” zaakceptowana odpowiedź
am05mhz

7
W niektórych przypadkach potrzebny jest X-Forwarded-Proto RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Kuzeko

1
zdecydowanie lepsza odpowiedź tutaj
skrilled

To działa dla mnie na serwerze GoDaddy. @Bradley Great !!
Wisznu

To działało dla mnie za każdym razem w różnych środowiskach serwerowych i konfiguracjach witryny. Powinna być zalecaną odpowiedzią IMHO.
John Contarino,

60

Jest to najlepsze rozwiązanie dla wwwi dla HTTPS, dla proxy i bez użytkowników proxy.

RewriteEngine On

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

### WWW & HTTPS

1
jak przekierować na stronę inną niż www?
Elyor,

to zdecydowanie najlepsza odpowiedź dla tych, którym %{HTTPS} offnie wystarcza
NoodleOfDeath

10

Wymuszam https następującym kodem:

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

1
@Niby sprawdź datę mojej odpowiedzi i „tę, która już tam jest”.
Arda

6

W przypadkach, gdy połączenie HTTPS / SSL kończy się na module równoważenia obciążenia, a cały ruch jest wysyłany do instancji na porcie 80, następująca reguła działa w celu przekierowania niezabezpieczonego ruchu.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Upewnij się, że mod_rewritemoduł jest załadowany.


4

Szukając najlepszego sposobu na przekierowanie, znalazłem to (pochodzące z html5boilerplate):

# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS)                              |
# ----------------------------------------------------------------------

# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"

Może to komuś pomoże w 2017 roku! :)


W 2017 roku powinna to być akceptowana odpowiedź. Powinien jednak zawierać to, że aby włączyć HSTS przez plik .htacces (pytanie jest oznaczone tym tagiem), musisz pominąć tagi IfModule. Jeśli edytujesz swoją odpowiedź z tym chętnie bym link tutaj z przyjętych odpowiedź
Jojo

Cześć Jojo! przepraszam za tak późną odpowiedź, masz na myśli usunięcie obu linii # <IfModule mod_headers.c>i # </IfModule>?
LIIT

hej LIIT, tak to miałem na myśli.
Jojo

1
Chociaż jest to przyjemne i pomaga osiągnąć lub wspierać (prawdopodobnie) pożądany efekt, nie przekierowuje to żądań http do https i jako takie nie odpowiada na pytanie. Działa tylko wtedy, gdy klient uzyskał już dostęp do witryny za pośrednictwem protokołu HTTPS (w określonym przedziale maksymalnego wieku). Dlatego zawsze powinno mu towarzyszyć odpowiednie przekierowanie.
Nicolai Ehemann

4

Wstaw ten kod do swojego pliku .htaccess. I powinno działać

RewriteCond %{HTTP_HOST} yourDomainName\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourDomainName.com/$1 [R,L]

3

Dodaj ten kod na końcu pliku .htaccess

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

1
Prawdopodobnie dlatego, że mod_rewrite nie jest włączony w tej odpowiedzi, tak jak w innych.
keji

Wystarczy dodać RewriteEngine ondo tego górę, aby to zadziałało.
Giacomo1968,

2

Dodanie następujących elementów na początku pliku .htaccess

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

2

Daje to pewność, że przekierowania działają dla wszystkich kombinacji nieprzezroczystych serwerów proxy.

Obejmuje to serwer WWW <http> proxy <https> klienta przypadku .

# behind proxy
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^http$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# plain
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^$
RewriteCond %{REQUEST_SCHEME} ^http$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

1

Miałem też problem z przekierowaniem. Wypróbowałem wszystko, co zaproponowano w Stackoverflow. Jedyny przypadek, który znalazłem sam, to:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

-1

Wymuszanie HTTPS przy użyciu .htaccesspliku

==> Przekieruj cały ruch internetowy: -

Aby zmusić cały ruch internetowy do korzystania z protokołu HTTPS, wstaw następujące wiersze kodu w .htaccesspliku w folderze głównym witryny.

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

==> Przekierowanie tylko określonej domeny: -

Aby wymusić na określonej domenie korzystanie z protokołu HTTPS, użyj następujących wierszy kodu w .htaccesspliku w folderze głównym witryny:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Jeśli to nie zadziała, spróbuj usunąć pierwsze dwie linie.

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

Pamiętaj, aby zastąpić example.com nazwą domeny, którą próbujesz wymusić na https. Dodatkowo musisz zastąpić www.example.com rzeczywistą nazwą domeny.

==> Określony folder przekierowania: -

Jeśli chcesz wymusić SSL w określonym folderze, wstaw poniższy kod do .htaccesspliku umieszczonego w tym folderze:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R=301,L]

Upewnij się, że zmieniłeś odniesienie do folderu na rzeczywistą nazwę folderu. Następnie pamiętaj, aby zastąpić www.example.com/folder rzeczywistą nazwą domeny i folderem, dla którego chcesz wymusić SSL.


-1

Zamień swoją domenę na domainname.com, działa ze mną.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domainname\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domainname.com/$1 [R,L]

2
Nie wysyłaj tylko kodu jako odpowiedzi, ale także wyjaśnij, co robi twój kod i jak rozwiązuje problem. Odpowiedzi z wyjaśnieniem są zwykle bardziej pomocne i lepszej jakości oraz częściej przyciągają głosy za.
Mark Rotteveel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.