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

Я пытаюсь реализовать HSTS (HTTP Strict Transport Security) на моем сайте Wordpress, но мне это не удается. Сначала мне удалось перенаправить мой сайт с не-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 приведен только для примера.

ИЗМЕНИТЬ - Я отредактировал свой файл example.com.conf, чтобы добавить дополнительные правила, данные моим MrWhite в ответе ниже, что выглядит точным. После выполнения команды apachectl configtest Syntaw был в порядке. Выполнил перезагрузку службы apache2 , чтобы изменения вступили в силу, и все браузеры сообщали, что страница не перенаправляется должным образом: ** ERR_TOO_MANY_REDIRECTS ** (очищал кеш каждый раз для каждого браузера) .

Я вернул htaccess только к исходным правилам Wordpress и Yoast SEO.

У моего текущего файла конфигурации на apache для этого VirtualHost могут быть проблемы, но нет синтаксической ошибки с apachectl configtest: https: // paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK

Я попытался использовать модуль разработчика Firefox (F12), чтобы узнать, могу ли я понять дополнительную информацию, проблема, похоже, связана с циклом перенаправления 301 на https: //www.example .com

РЕДАКТИРОВАТЬ 2: Благодаря @MrWhite я понял, что деталь ServerAlias ​​ не нужна и является причиной зацикливания. Проблема решена и извлечена из этого опыта.

1
задан 30 November 2020 в 12:14
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. Отправьте заголовок HTTP-ответа Strict-Transport-Security(STS) только при использовании HTTPS. В том числе и на каноническом редиректе (№2 выше).

    (Несмотря на то, что некоторые источники утверждают, что заголовок STS должен толькоотправляться по HTTPS и даже полностью недействителен для отправки по простому HTTP, я не верю, что это так. Спецификация гласит, что UA должен просто игнорировать этот заголовок при отправке по HTTP, так что это не является «проблемой» отправить его и по HTTP. Я реализовал это ниже.)

Таким образом, это означает, что вы не можете обязательно канонизировать запрос (HTTP/HTTPS/www/не-www) в одном перенаправлении, поскольку это может нарушить пункт 1 выше.

Похоже, вы также не устанавливаете заголовок STS в коде, который вы разместили. Если вы реализуете перенаправление в Apache (конфигурация сервера или .htaccess), то вы не можете установить этот заголовок с помощью WordPress — если это то, что вы делаете?

Я немного погуглил и нашел эту ссылку, которая выглядела как решение с помощью htaccess.

Это «решение» не реализует HSTS. Единственная цель этой статьи — канонизировать запрос в одном перенаправлении. «Предупреждение» в верхней части этой статьи прямо говорит вам, что оно нарушает HSTS.

Вы также поставили директивы в неправильном порядке. Эти директивы «перенаправления» должны идти допереднего контроллера WordPress, иначе они просто не будут обрабатываться для виртуальныхURL-адресов WordPress.

Я предполагаю, что ваше каноническое имя хоста www.example.com. (Хотя в заголовке вопроса вы упомянули перенаправление на не-www, в остальной части вопроса вы перенаправляете на www?)

Я пытался использовать конфигурационный файл 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 месяц и не включает параметр предварительной загрузки. Обязательно следуйте инструкциям, приведенным в «требованиях к развертыванию» списка предварительной загрузки 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

The В директиве Headerтребуется условие always, поэтому заголовок устанавливается для ответов, отличных от 200 OK. т.е. его необходимо установить для перенаправления HTTPS 301 без www на www.

См. также мой ответ на следующий вопрос в CodeReview SE относительно реализации HSTS в .htaccess:

3
ответ дан 29 November 2020 в 16:17

Теги

Похожие вопросы