Исках да изпратя уебсайта си на собствения си сървър на 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 реда по-високо.
Хубавото на този код е, че не сте кодирали твърдо името на сървъра или домейна, така че е доста общо и може да се използва на редица сайтове, както е.