
Я пытаюсь реализовать HSTS (HTTP Strict Transport Security) на моем сайте Wordpress, но у меня ничего не получается. Сначала мне удалось перенаправить мой сайт с non-www на www , включая https:// , но я получил сообщение наhttps://hstspreload.org/что он должен сначала перенаправить на www.
Я пытался использовать файл конфигурации VirtualHosts, но безуспешно. Поэтому я немного погуглил и нашелэта ссылкачто выглядело как решение с htaccess, но проблема все еще не устранена. Если кто-то знает, как реализовать это через файлы конфигурации VirtualHost / Apache, это было бы очень здорово.
Ошибка: HTTP сначала перенаправляет на www
http://inter.net
(HTTP) должен немедленно перенаправлять наhttps://inter.net
(HTTPS) перед добавлением поддомена www. Прямо сейчас первым перенаправлением являетсяhttps://www.inter.net/
. Дополнительное перенаправление необходимо для того, чтобы любой браузер, поддерживающий HSTS, записал запись HSTS для домена верхнего уровня, а не только для поддомена.
Мой htaccess ниже:
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
#### This is what I added : From https://www.danielmorell.com/guides/htaccess-seo/redirects/https-www-and-trailing-slash
#### Force HTTPS://WWW and remove trailing / from files ####
## Turn on rewrite engine
RewriteEngine on
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.inter.net/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://www.inter.net/$1/ [R=301,L]
# Force HTTPS and WWW
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [OR,NC]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://www.inter.net/$1 [R=301,L]
# Yoast SEO - XML Sitemap Rewrite Fix
RewriteEngine On
RewriteBase /
RewriteRule ^sitemap_index.xml$ /index.php?sitemap=1 [L]
RewriteRule ^locations.kml$ /index.php?sitemap=wpseo_local_kml [L]
RewriteRule ^geo_sitemap.xml$ /index.php?sitemap=geo [L]
RewriteRule ^([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 [L]
RewriteRule ^([a-z]+)?-?sitemap.xsl$ /index.php?yoast-sitemap-xsl=$1 [L]
# END Yoast SEO - XML Sitemap Rewrite Fix
ps - URL-адрес inter.net приведен только для примера.
EDIT - Я отредактировал свой файл example.com.conf, чтобы добавить дополнительные правила, указанные в моем ответе MrWhite ниже - что выглядит точным. После запуска команды apachectl configtest
Syntaw был в порядке. Запустил, service apache2 reload
чтобы изменения вступили в силу, и получил все браузеры, говорящие, что страница не перенаправляется должным образом : **ERR_TOO_MANY_REDIRECTS**
(очищал кэш каждый раз для каждого другого браузера).
Я вернул htaccess только к исходным правилам WordPress и Yoast SEO.
Мой текущий файл конфигурации на Apache для этого VirtualHost может иметь проблемы, но синтаксических ошибок в apachectl configtest нет:https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK
Я попытался использовать модуль разработчика Firefox (F12), чтобы посмотреть, смогу ли я понять какую-либо дополнительную информацию, проблема, похоже, в цикле перенаправления 301 наhttps://www.example.com
EDIT 2: Спасибо @MrWhite, я понял, что эта ServerAlias
деталь была ненужной и была причиной циклов. Проблема решена и урок сделан.
решение1
Подводя итог, основными требованиями HSTS являются:
Перенаправление с HTTP на HTTPSна том же хосте. то есть
http://example.com
кhttps://example.com
иhttp://www.example.com
кhttps://www.example.com
Перенаправление на каноническое имя хоста (с www или без www) только по HTTPS. (т.е. после пункта 1 выше)
Отправлять
Strict-Transport-Security
заголовок ответа HTTP (STS) только при использовании HTTPS. Включая каноническое перенаправление (#2 выше).(Хотя некоторые источники утверждают, что заголовок STS должентолькобыть отправлено по HTTPS и даже совершенно недопустимо отправлять его по простому HTTP, я не верю, что это так.Спецификацияутверждает, что UA должен просто игнорировать этот заголовок при отправке по HTTP, поэтому не является «проблемой» отправить его также по HTTP. Однако не так уж и сложно отправить его только по HTTPS, и именно так я это реализовал ниже.)
Это означает, что вы не можете обязательно канонизировать запрос (HTTP / HTTPS / www / без www) в одном перенаправлении, поскольку это может нарушить пункт 1 выше.
Вы также, похоже, не устанавливаете заголовок STS в коде, который вы опубликовали. Если вы реализуете перенаправление в Apache (конфигурация сервера или .htaccess
), то вы не можете установить этот заголовок с помощью WordPress - если это то, что вы делаете?
Я немного погуглил и нашел эту ссылку, которая выглядела как решение с htaccess
Это "решение" не реализует HSTS. Единственная цель этой статьи - канонизировать запрос в одном перенаправлении. "Предупреждение" в верхней части этой статьи явно говорит вам, что это нарушает HSTS.
Вы также разместили директивы в неправильном порядке. Эти директивы "перенаправления" должны быть удаленыдофронт-контроллер WordPress, в противном случае он просто не будет обработан для WordPressвиртуальныйURL-адреса.
Я предполагаю, что ваше каноническое имя хоста — www.example.com
. (Хотя в заголовке вашего вопроса вы упоминаете перенаправление на адрес без www, вы перенаправляете на www на протяжении всего оставшегося вопроса?)
Я пытался использовать файл конфигурации VirtualHosts, но безуспешно.
Хотя, возможно, проще, менее подвержено ошибкам и более эффективно реализовать это в конфигурации сервера (используя отдельные VirtualHosts).
Например (опуская «другие» необходимые директивы):
<VirtualHost *:80>
ServerName example.com
# Redirect to HTTPS - same host
Redirect 301 / https://example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
# Redirect to HTTPS - same host
Redirect 301 / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
# Redirect to canonical host (HTTPS only)
Redirect 301 / https://www.example.com/
# SSL directives...
# Set STS header on the HTTPS redirect ("always" argument is required for this)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
<VirtualHost *:443>
# Canonical host
ServerName www.example.com
# SSL directives...
# etc.
# Set STS header on the HTTPS response
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
Обратите внимание, что заголовок STS в приведенном выше примере устанавливает max-age
параметр только на период в 1 месяц и не включает параметр preload
. Обязательно следуйте инструкциям, приведенным в «требованиях к развертыванию» списка предварительной загрузки HSTS, если это является намерением.https://hstspreload.org/#deployment-recommendations
Альтернативно, чтобы реализовать это в.htaccess
(Примечание: я не реализовал перенаправление с помощью «завершающего слеша», поскольку вы не упомянули об этом в своих требованиях, и это просто часть кода, скопированная из внешней статьи.)
# Set HSTS env var only if HTTPS
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=HSTS:1]
# Redirect HTTP to HTTPS on the same host
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Redirect non-www to www (HTTPS only)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Set HSTS header conditionally if request is over HTTPS only (based on HSTS env var)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains" env=HSTS
# Yoast SEO - XML Sitemap Rewrite Fix
# : (directives go here...)
# END Yoast SEO - XML Sitemap Rewrite Fix
# BEGIN WordPress
# : (directives go here...)
# END WordPress
Условие always
является обязательным для Header
директивы, поэтому заголовок устанавливается для ответов, отличных от 200 OK. т. е. его необходимо установить для перенаправления HTTPS 301 с non-www на www.
Смотрите такжемой ответна следующий вопрос на CodeReview SE относительно внедрения HSTS в .htaccess
: