
私はWordpressサイトにHSTS(HTTP Strict Transport Security)を実装しようとしていますが、うまくいきません。まず、サイトを非wwwからwwwにリダイレクトし、https://を含めるようにしましたが、https://hstspreload.org/まず www にリダイレクトする必要があること。
VirtualHosts設定ファイルを使おうとしたのですが、うまくいきませんでした。そこでグーグルで検索して、このリンクこれは htaccess による解決策のように見えますが、まだ問題は解決しません。VirtualHost / Apache 構成ファイルを使用してこれを実装する方法を知っている方がいらっしゃいましたら、本当に助かります。
エラー: HTTP は最初に www にリダイレクトします
http://inter.net
(HTTP) は、https://inter.net
www サブドメインを追加する前に、すぐに (HTTPS) にリダイレクトする必要があります。現在、最初のリダイレクトは です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 - inter.net の URL は単なる例です。
編集 - 以下の回答で MrWhite が示している追加ルールを追加するため、example.com.conf ファイルを編集しました。これは正確そうです。コマンド apachectl configtest
Syntaw を実行した後は問題ありませんでした。service apache2 reload
変更を有効にするために実行したところ、すべてのブラウザーでページが正しくリダイレクトされていないというメッセージが表示されました : **ERR_TOO_MANY_REDIRECTS**
(ブラウザーごとにキャッシュを毎回クリアしました)。
htaccess を元の Wordpress と Yoast SEO ルールのみに戻しました。
この VirtualHost の Apache 上の現在の構成ファイルには問題があるかもしれませんが、 apachectl configtest には構文エラーはありません。https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK
Firefox開発者モジュール(F12)を使用して、追加情報を理解できるかどうかを確認しようとしましたが、問題は301リダイレクトループのようです。https://www.example.com
ServerAlias
編集 2: @MrWhite のおかげで、詳細は不要であり、ループの原因であったことがわかりました。問題は解決し、そこから学びました。
答え1
要約すると、HSTS の主な要件は次のとおりです。
HTTP から HTTPS へのリダイレクト同じホスト上. つまり
http://example.com
、https://example.com
そしてhttp://www.example.com
にhttps://www.example.com
HTTPS のみで正規のホスト名 (www または非 www) にリダイレクトします。 (つまり、上記の #1 の後)
HTTPS の場合のみ、(STS) HTTP 応答ヘッダーを送信します
Strict-Transport-Security
。正規のリダイレクト (上記の #2) を含みます。(いくつかの情報源ではSTSヘッダーはのみHTTPS 経由で送信することはできず、プレーン HTTP 経由で送信することも完全に無効ですが、私はそうではないと考えています。仕様は、UA が HTTP 経由で送信する場合、このヘッダーを単に無視する必要があると述べているため、これを HTTP 経由で送信しても「問題」にはなりません。ただし、これを HTTPS 経由でのみ送信するのはそれほど手間がかかりません。以下では、これをそのように実装しました。
つまり、上記の #1 に違反する可能性があるため、1 回のリダイレクトでリクエスト (HTTP / HTTPS / www / non-www) を必ずしも正規化できるわけではありません。
また、投稿したコードでは STS ヘッダーを設定していないようです。Apache (サーバー構成または.htaccess
) でリダイレクトを実装している場合、WordPress を使用してこのヘッダーを設定することはできません。そうしているのですか?
グーグルで検索してみたところ、htaccessを使った解決策のように見えるこのリンクを見つけました。
その「解決策」は HSTS を実装していません。その記事の唯一の目的は、リクエストを単一のリダイレクトで正規化することです。その記事の先頭にある「警告」は、それが HSTS に違反していることを明示的に伝えています。
また、ディレクティブの順序も間違っています。これらの「リダイレクト」ディレクティブは前にWordPressのフロントコントローラで処理されないと、WordPressのバーチャルURL。
正規のホスト名は であると想定していますwww.example.com
。(質問のタイトルでは非 www へのリダイレクトについて言及していますが、質問の残りの部分では www にリダイレクトしていますか?)
VirtualHosts 構成ファイルを使用しようとしましたが、うまくいきませんでした。
ただし、これをサーバー構成で実装する (別の VirtualHost を使用する) 方が、より簡単でエラーも少なく、効率的であると言えます。
たとえば (「その他の」必要なディレクティブは省略) :
<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 以外の応答に設定されます。つまり、非 www から www への HTTPS 301 リダイレクトに設定する必要があります。
参照私の答えCodeReview SE の HSTS の実装に関する次の質問に対して.htaccess
: