Äskettäin siirtänyt sivuston SSL: ään tutkin HSTS: n käyttöönottoa mahdollisen esilatauksen varalta. Syntaksi on hyväksytty ja Chrome-luettelo sallii sen olevan OK. Kuitenkin olematta kooderi ollenkaan, syntyy pieni ongelma.

Minulla on:

php_value upload_tmp_dir '/tmp' # Force SSL RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Redirect to www RewriteCond %{HTTP_HOST} ^example.com\.com [NC] RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L] # Security header Header set Strict-Transport-Security 'max-age=63072000; preload; includeSubdomains' env=HTTPS # End Force SSL' 

Tämä näyttää hyvältä, mutta jotkut verkkosivustot --- en sekoita tätä siteillä --- neuvoo RewriteCond %{HTTPS} off ja muilla on RewriteCond %{HTTPS} on

Loogisesti ON näyttää oikealta, mutta minun on tiedettävä mikä on oikein. Kumpikaan ei anna virheitä.

... neuvoo RewriteCond %{HTTPS} off ja muilla on RewriteCond %{HTTPS} on

Sillä ei olisi järkeä esitetyssä kontekstissa, koska nämä ovat ilmeisesti vastakohtia (haluaisin nähdä täydelliset esimerkit, joista lainaat tätä).

Ehkä tarkoitat off vs. !on? Nämä vastaavat tässä yhteydessä. ! etuliite hylkää regeksin, joten se tarkoittaa käytännössä ei "päällä" (ts. sen on oltava "pois päältä").

Joten yllä olevien direktiiviesi yhteydessä, kun testaat, onko HTTPS ole aktiivinen, seuraavat ovat vastaavia:

# Does the HTTPS server variable contain 'off'? RewriteCond %{HTTPS} off # Does the HTTPS server variable not contain 'on'? RewriteCond %{HTTPS} !on 

HTTPS-palvelinmuuttuja on joko "päällä" tai "pois". (Tai sitä ei ole asetettu lainkaan - mutta se riippuu palvelimesi / SSL-asetuksistasi ja olet jo huomannut sen nyt.)

Käyttämäsi on oikeastaan ​​vain mieltymysten asia.


Muita huomautuksia HSTS: stä ja .htaccess

# Redirect to www 
RewriteCond %{HTTP_HOST} ^example.com\.com [NC] RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L] 
# Security header 
Header set Strict-Transport-Security 'max-age=63072000; preload; includeSubdomains' env=HTTPS 

(Oletan ylimääräisen .com sisään ^example.com\.com on vain kirjoitusvirhe? Sen pitäisi olla oikeudenmukaista ^example\.com.)

E=HTTPS - Tarkoituksen asettaa ympäristömuuttuja HTTPS on RewriteRule uudelleenohjaus on pystyttävä asettamaan ehdollisesti Strict-Transport-Security HTTP-vastausotsikko kanonisessa (vain HTTPS) ei-www-uudelleenohjauksessa[*1] (eli. https://example.com että https://www.example.com) perustuu env=HTTPS tarkista Header direktiivi. Kuitenkin, jotta tämä otsikko asetetaan uudelleenohjaus, sinun on myös käytettävä always avainsana Header kuten näin:

Header always set Strict-Transport-Security 'max-age=63072000; preload; includeSubdomains' env=HTTPS 

Kuten Apache-asiakirjoissa todetaan, always kanssa Header kun asetat otsikot päälle ohjaa uudelleen:

  • Olet lisäämässä otsikon paikallisesti luotuun epäonnistuneeseen (ei-2xx) -vastaukseen, kuten uudelleenohjaukseen, jolloin vain taulukkoa vastaava taulukko always käytetään lopullisessa vastauksessa.

[*1] Tämä otsikko on asetettava uudelleenohjaukseen HSTS-esilatausvaatimusten 4.1 kohdan täyttämiseksi:

Jos tarjoat ylimääräistä uudelleenohjausta HTTPS-sivustoltasi, uudelleenohjauksessa on silti oltava HSTS-otsikko (sen sivun sijaan, jolle se uudelleenohjaa).


Vain seuraava kommentti linkitetystä artikkelista alla olevissa kommenteissa, jossa todetaan:

env=HTTPS ympäristömuuttuja ei toiminut odotetulla tavalla. Joten käytin E=HTTPS lippu www-uudelleenohjauksessa osoitteeseen aseta env=HTTPS ympäristömuuttuja seuraavassa pyynnössä.

Viimeinen bitti " env=HTTPS ympäristömuuttuja seuraavassa pyynnössä "ei ole aivan oikea. Se asettaa HTTPS ympäristömuuttuja nykyinen (uudelleenohjaus) vastaus. Siihen mennessä, kun "seuraava pyyntö" tulee (eli selain on vastannut uudelleenohjaukseen), tämä ympäristömuuttuja (joka asetettiin edellä) unohdetaan kauan. Mutta tämä vaatii always avainsana, jota käytetään Header (kuten edellä mainittiin).


Header always set Strict-Transport-Security 'max-age=63072000; preload; includeSubdomains' env=HTTPS 

Vain pieni asia, ja ehkä tällä ei ole väliä, mutta ... sisältäisin preload direktiiviluettelon lopussa. Esimerkiksi:

 Header always set Strict-Transport-Security 'max-age=63072000; includeSubdomains; preload' env=HTTPS 

preload direktiivi ei itse asiassa ole osa HTTP Strict Transport Security (HSTS) -määritystä. se on vain esilatausluettelo vaatii. Muut käyttäjäagentit / selaimet eivät käytä tätä eivätkä ehkä edes ymmärrä tätä, joten olisi loogisempaa laittaa tämä luettelon loppuun. Jotkut jäsentelyt saattavat lakata heti, kun ne saavuttavat "virheellisen" direktiivin?


PÄIVITTÄÄ: Tämä ei kuitenkaan näytä olevan täydellinen ratkaisu. Nykyisessä muodossaan HSTS-vastausotsikko on vain asetetaan ei-www-www (HTTPS) -ohjaukseen. Sitä ei ole asetettu muille HTTPS-vastauksille, minkä sen pitäisi olla. On aivan mahdollista, että sovellus palauttaa tämän otsikon, mutta tästä ei ole todisteita (paitsi että OP ilmoittaa läpäisevänsä HSTS-tarkistuksen).

Täydellisemmäksi .htaccess- vain ratkaisu, katso vastaukseni seuraavaan kysymykseen: HSTS-toteutus käytettäessä www.TLD: tä

  • Kiitos. Olet oikeassa, kun olet! POIS = hostinger.com/tutorials/ssl/forcing-https PÄÄLLÄ = stackoverflow.com/questions/33268353/…
  • Valitettavasti Enter-näppäimen painaminen vain sulkee kommentin.
  • 1 E = HTTPS tuli täältä täältä muistani --- Katsoin paljon tylsiä esimerkkejä! --- foorumit.cpanel.net/threads/htaccess-header-set-doesnt-set.613111
  • @Claverhouse Kiitos linkeistä. Muuten, !=on on käytännössä sama kuin !on tässä yhteydessä (tulos on sama tässä). On kuitenkin eroa. = etuliite tekee siitä tarkan merkkijonovertailun, kun taas ilman =, se on regex ja niin tarkistaa "päällä" missä tahansa sisällä TestString. Se voi koskaan olla vain "päällä" tai "pois", joten tulos on sama. Erittäin mielenkiintoinen E=HTTPS on uudelleenohjaus - ensimmäinen kommenttini siitä oli väärä. Sinun on kuitenkin lisättävä always avainsana Header jotta se toimisi kunnolla. Olen päivittänyt vastaukseni.
RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Tarkista, ettei HTTPS ole päällä

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

Tarkista, onko HTTPS ON pois päältä

RewriteCond %{SERVER_PORT} !^443$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

Tarkista, toimiiko yhteys EI suojatussa https-portissa 443

Mutta ne kaikki tekevät samoin: tarkista, onko https: ää, ja ohjaa uudelleen https: ään.

 Header set Strict-Transport-Security 'max-age=10886400; includeSubDomains; preload'  

Tiedät jo mitä se tekee.

  • kääreä ei tarvita tässä. Itse asiassa, jos aiot käyttää "HSTS-esilatausluetteloa", kääre tulisi poistaa, koska tämä otsikko on pakollinen. Sinulta puuttuu myös suositeltu env=HTTPS kunto.
  • IfModule kääre on tarkoitettu tarkistamaan, onko osoitettu moduuli jo asennettu. Mitä tulee env=HTTPS en ole varma - on olemassa joukko toimivia esimerkkejä sen kanssa ja ilman sitä.
  • 'IfModule kääre on tarkistus tarkoitukseen ... "- Kyllä, mutta se on ongelma. Jos mod_headersia ei ole asennettu, direktiivi yksinkertaisesti epäonnistuu hiljaa ja otsikkoa ei ole asetettu. Tämä otsikko on pakko HSTS: n onnistumiseksi. Tämä pitäisi tauko, jos mod_headers ei ole käytettävissä, koska tämä otsikko ei ole valinnainen. Katso tämä aiheeseen liittyvä kysymys mod_rewrite (sama idea): webmasters.stackexchange.com/questions/112600/…
  • Kiitos molemmille. Foorumi sisältää nyt ehdotuksesi. Muuten (en pyydä lisäneuvoja), WordPressissä erinomaisen hakkeroinnin osan on mentävä ensin .htaccess-tiedostoon. hackrepair.com/articles/website-security/… Huomaa vain, että esilataus ei näytä pitävän siitä!
  • Lisätty yllä kommenttina pikemminkin kuin väärin. Muuten vastaamaan, jätin hakkeroinnin sisään ja en vaivaudu esiladata WordPress ...

työskennellyt sinulle: Charles Robertson | Haluatko yhteyttä?