2015-03-13 35 views
13

Szukałem idealnego przekierowania 301. Ale znajduję tak wiele rozwiązań i nie wiem, co jest najlepsze.Dobra praktyka: 301 Przekieruj HTTP do HTTPS (standardowa domena)

Oto co chcę zrobić

Dobrych Praktyk .htacess?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

To jest mój ulubiony kod. Przynajmniej rozwiąż teraz.

Alternatywne sposoby

Znalazłem również wiele innych sposobów, aby przekierować z HTTP do HTTPS. Na przykład:

1.

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

Brakujące jeden krok? I nie ma tutaj [R=301,L]?

2.

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

Is a different order generally better?

powinienem używać

RewriteRule ^(.*)$ 

zamiast

RewriteRule (.*) 

?

3.

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} example\.com$ [NC] 
RewriteRule^https://example.com%{REQUEST_URI} [R=301,L,NE] 

Czy przy użyciu pełnej nazwy domeny mają żadnych korzyści z wydajnością? Czy naprawdę potrzebuję NE? ([R=301,L,NE] vs. [L,R=301])

Więc moje pytanie do wszystkich ekspertów: Jaki jest najlepszy (sceniczne) sposób przekierować zarówno z HTTP do HTTPS iz do HTTPS://?

Odpowiedz

13

Aby uruchomić z ulubionym rozwiązanie:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

w części postępowania nie HTTPS jesteś przekierowanie do %{HTTP_HOST}.Następnie, jeśli nazwa hosta zaczyna się od "www", musi nastąpić drugie przekierowanie, aby wysłać Cię z https://www.domain.tld do , która ma być Twoim ostatecznym miejscem docelowym.

można skrócić to za pomocą

RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301] 

bezpośrednio w pierwszej regule. Druga zasada miałaby wtedy zastosowanie tylko do klientów, którzy próbują uzyskać dostęp do https://www.domain.tld.

Alternatywa 1. nie działa z tego samego powodu (brakuje przypadku, w którym HTTP_HOST może być www.domain.tld) i dodatkowo z powodu braku numeru [L,R=301]. Jest to konieczne, ponieważ nie przepisujesz tutaj adresu URL, tak jak w innych typach reguł przepisywania. Żądasz od klienta zmiany typu żądania - dlatego wysyłasz mu kod HTTP o numerze 301.

Jeśli chodzi o część dopasowania samego siebie, to należy być konsekwentnym: jeśli chcesz przechwycić części URI, użyjesz wyrażeń regularnych z nawiasami. Ponieważ w rzeczywistości używasz go jako całości, dobrze jest użyć jednej z alternatyw dla "czegoś", jak na przykład ^ i później użyć %{REQUEST_URI}. Jeśli użyć trochę przechwytywanie (tj (some_regex) należy odwoływać się do niej w celu stosując $1 (lub cokolwiek masz zamiar odwołać) tutaj.

W swojej 3 alternatywy, znowu www + https brakuje.

można sprawdzić, czy https jest wyłączony lub jeśli nazwa domeny zawiera wiodącą „www” w jednej reguły jednak przepisać warunki są pośrednio związane z „i”

Tak powinno być:.

RewriteCond %{HTTPS} off   [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule^https://domain.tld%{REQUEST_URI} [R=301,L,NE] 

NE jest niezbędne do przejścia na takie rzeczy jak Get-parametrów i tym podobne na nowy URI niezmienione, patrz:

http://httpd.apache.org/docs/2.4/rewrite/flags.html

+0

dzięki. Używam teraz tego kodu: RewriteEngine On RewriteCond% {HTTPS} off RewriteRule^(. *) $ Https://example.com/%{REQUEST_URI} [R = 301, L , NE] RewriteCond% {HTTP_HOST}^www \. (. +) $ [NC] RewriteRule^https: //% 1% {REQUEST_URI} [R = 301, L, NE] dash

+0

Wiem, że to nieco stara odpowiedź, ale przyzwyczajenie 'RewriteRule^https: //domain.tld/% {REQUEST_URI} [R = 301, L, NE]' z alternatywnego powrotu 3, np. https: //domain.tld//index.html z podwójnymi ukośnikami? Czy linia nie powinna odczytywać 'RewriteRule^https: //domain.tld/% {REQUEST_URI} [R = 301, L, NE]' bez ukośnika między statycznym tekstem domeny a '% {REQUEST_URI}'? –

+0

masz rację: Właśnie poprawiłem ten – nlu

2

Tak, kondensacji, to staje się;

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

Daj mi znać, jeśli widzisz jakieś błędy