Перенаправление HSTS и Wordpress на www и без www и https — как избежать множественных перенаправлений?

Перенаправление HSTS и Wordpress на www и без www и https — как избежать множественных перенаправлений?

Я пытаюсь реализовать 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 configtestSyntaw был в порядке. Запустил, 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 являются:

  1. Перенаправление с HTTP на HTTPSна том же хосте. то есть http://example.comкhttps://example.com и http://www.example.comкhttps://www.example.com

  2. Перенаправление на каноническое имя хоста (с www или без www) только по HTTPS. (т.е. после пункта 1 выше)

  3. Отправлять 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:

Связанный контент