Исках да изпратя уебсайта си на собствения си сървър на Debian Apache2 в списъка за предварително зареждане на HSTS.

Каза ми, че имам няколко неща, които са неправилно настроени, така че направих корекции, сега изглежда е доволен. Има само едно нещо, в което не съм сигурен как работи или дали съм го направил правилно? Следният код за пренасочване към https и www се поставя директно във конфигурационен файл на виртуален хост. Може ли някой да погледне и да ми обясни как работи и ако има някакви грешки, моля да предложи корекции.

RewriteEngine on RewriteCond %{HTTPS} !on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301] RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R] 

РЕДАКТИРАНЕ1:

Всички редове от този код се поставят в HTTP (порт 80) раздел.

РЕДАКТИРАНЕ2:

Не съм сигурен дали да сваля www или го добавете още. Така че бих се радвал да видя и двата подхода, ако не е толкова трудно да се приложи.

поставени директно във виртуален хост

Но къде точно? Ако сте внедрили SSL, тогава ще имате поне два контейнера VirtualHost, единият за SSL / HTTPS (порт 443), а другият за HTTP (порт 80).

Трябва да сте поставили тези директиви в контейнера VirtualHost за порт 80, за да успеете да приложите HTTP към HTTPS пренасочване. Ако обаче това е така, тогава проверката срещу HTTPS е излишно. Но също така, ако тези директиви са само в VirtualHost за порт 80, тогава канонизацията от www към не www никога няма да възникне при достъп до неканоничната https://www.example.com URL директно. (Или сте поставили тези директиви и в двата VirtualHosts? Което е ненужно.)

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301] 

Без L флаг, обработката ще продължи. Ако поискате http://www.example.com след това ще пренасочи към https://example.com. Обикновено това е наред, но изглежда, че това нарушава една от предпоставките на списъка за предварително зареждане на HSTS, който гласи, че трябва да пренасочите към един и същ домакин. (И така, трудно е да се каже как това изглежда „работи“ по отношение на удовлетворяването на критериите за списъка за предварително зареждане на HSTS?)

%{SERVER_NAME} - макар че това може да работи добре на вашия сървър, това не е най-надеждната променлива за използване в този случай, тъй като искате винаги да пренасочвате към един и същ хост (не определеният ServerName). Трябва да използвате HTTP_HOST вместо това тук, за да сте сигурни, че пренасочвате към същия хост, както е посочено в заявката. (В конфигурация на сървър по подразбиране, SERVER_NAME е същото като HTTP_HOSTобаче това зависи от това дали UseCanoncialName е зададено.)

RewriteRule ^(.*)$ https://%1/$1 [R] 

Както @ltai вече спомена в своя отговор, това е временно (302) пренасочване и трябва да бъде постоянно (301) пренасочване. Вие също пропускате L флаг, което може да причини проблеми, ако добавите по-късни директиви.

Също така, когато се използва в контекст на VirtualHost, това ще доведе до двойна наклонена черта в RewriteRule заместване, напр. https://example.com// от уловения шаблон включва префиксът наклонена черта (в контекст на VirtualHost). В първата си RewriteRule, вие специално изключвате префикса наклонена черта (т.е. ^/?(.*)); трябва да правите същото тук.


Тези директиви трябва да бъдат разделени между двата (или повече) VirtualHosts. Например:

 ServerName example.com ServerAlias www.example.com # Unconditional redirect to HTTPS on the same host # (The 'same host' is a requirement of the HSTS preload list) RewriteEngine On RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]   ServerName example.com ServerAlias www.example.com # SERVER_NAME now refers to the value of ServerName, not HTTP_HOST UseCanonicalName On # Redirect from www to the canonical ServerName RewriteEngine On RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]  

Обикновено бихте постигнали HTTP към HTTPS и www към non-www канонизация в едно пренасочване. Изискване от списъка за предварително зареждане на HSTS обаче гласи, че трябва да пренасочите HTTP към HTTPS на един и същ домакин, което означава, че ще трябва да го запазите като два. (Въпреки това, след като сте в списъка за предварително зареждане на HSTS, тогава HTTP към HTTPS пренасочване така или иначе никога няма да се случи.)

Единственото нещо, което бих променил, е също така да задам последното правило, което да дава постоянно пренасочване.

RewriteEngine on 

Този ред казва да включите двигателя за пренасочване, без което нито едно правило не би работило.

RewriteCond %{HTTPS} !on 

Това казва, че условието е схемата да не е https. Това е същото, както ако сте използвали off за разлика от !on кое е не на.

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301] 

Това е правилото за изпълнение, когато HTTPS НЕ е включен. Казва се вземете каквото е след началната наклонена черта (ако има такава) или цялата част на URL адреса и пренасочете към HTTPS със същия сървър. Отговорът тук е 301, който е постоянно пренасочване.

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 

В горния ред се казва, че условието е хостовете да започнат с www. и че всичко след това се улавя, за да се използва в следващото правило. Ето защо има a (.*)

RewriteRule ^(.*)$ https://%1/$1 [R] 

Това правило казва да пренасочите всяка заявка към https:// последвано от частта на хоста, която е след www (% 1) и след това от заявката ($ 1). Резултатът е 302 TemporaryRedirect, тъй като не сте посочили код за връщане като R=301 както направихте 2 реда по-високо.

Хубавото на този код е, че не сте кодирали твърдо името на сървъра или домейна, така че е доста общо и може да се използва на редица сайтове, както е.

е работил за вас: Charles Robertson | Искате ли да се свържете с нас?