Best Practice: 301 Redirect HTTP to HTTPS (Dominio standard)

Ho cercato il redirect 301 perfetto. Ma sto trovando così tante soluzioni e non so cosa sia meglio.

Ecco cosa voglio fare

  • http: //domain.tld/ → https: //domain.tld/
  • http: //www.domain.tld/ → https: //domain.tld/
  • https: //www.dominio.tld/ → https: //domain.tld/

Best practice .htacess?

 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]  

Questo è il mio codice preferito. Almeno unil ora.

Modi alternativi

Ho anche trovato molti altri modi per redirect da HTTP a HTTPS . Per esempio:

1.

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

Manca un passaggio? E no [R=301,L] qui?

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] 

Un altro ordine è generalmente migliore ?

Dovrei usare

 RewriteRule ^(.*)$ 

invece di

 RewriteRule (.*) 

?

3.

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

L’utilizzo del nome di dominio completo presenta vantaggi in termini di prestazioni? Ho davvero bisogno di NE ? ( [R=301,L,NE] vs. [L,R=301] )

Quindi, la mia domanda a tutti gli esperti: qual è il modo migliore (performante) per redirect sia da HTTP a HTTPS e da su HTTPS:// ?

Per iniziare con la tua soluzione preferita:

  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]  

Nella parte che gestisce gli URL non-https stai reindirizzando a %{HTTP_HOST} . Quindi, nel caso in cui il nome host sia stato avviato con “www”, è necessario eseguire un secondo reindirizzamento per inviarti da https: //www.domain.tld a https: //domain.tld che dovrebbe essere la tua destinazione finale.

Puoi accorciarlo usando

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

direttamente nella prima regola. La seconda regola si applicherebbe quindi solo ai client che tentano di accedere a https://www.domain.tld .

L’alternativa 1. non funziona per lo stesso motivo (manca il caso che HTTP_HOST possa essere www.domain.tld ) e in aggiunta a causa della mancanza [L,R=301] . Questo è necessario perché non si riscrive semplicemente un URL qui, come si potrebbe fare in altri tipi di regole di riscrittura. Stai richiedendo al cliente di modificare il tipo di richiesta: è per questo che gli stai inviando un codice HTTP 301 .

Per quanto riguarda la parte corrispondente della RewriteRule stessa, dovresti essere coerente: se vuoi catturare parti dell’URI userai un’espressione regolare con parentesi. Dato che in effetti lo stai usando nel suo insieme, va bene usare solo una delle alternative per “qualsiasi cosa”, come ^ e usare %{REQUEST_URI} più tardi. Se usi un po ‘di cattura (es. (some_regex) dovresti (some_regex) riferimento nel target usando $1 (o qualunque cosa tu (some_regex) fare riferimento qui).

Nella tua terza alternativa, manca ancora www + https.

È ansible controllare se https è distriggersto o se il nome di dominio contiene un “www” principale in una regola, tuttavia le condizioni di riscrittura sono implicitamente collegate a “e”.

Quindi dovrebbe leggere:

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

Il NE è necessario per passare immutati cose come GET-parametri e simili al nuovo URI, vedi:

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

Quindi, condensando, questo diventa;

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

Fammi sapere se vedi qualche bug