treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

SSLサーバ証明書更新時のリダイレクトを考える

以前に.htaccessを設置して、サイトへのhttp接続をhttps接続にリダイレクトしていましたが、SSLサーバ証明書の更新時に引っ掛かったことがあったのでご報告です。
実施したのはだいぶ前の話ですが自分の備忘録という意味で残しておきます。

※なお、文中のURLは実際には存在しません。

SSLサーバ証明書の更新時の問題

2Way(wwwありなし両方をhttps対応する)のSSLサーバ証明書の更新時にファイル認証による審査を実施する場合、.htaccessでリダイレクトが設定されているサイトではドメインで認証を行うことができなかったので、やり直しになるということがありました。

具体的には、SSLサーバ証明書の更新時に「ドメイン審査のための認証ファイルにアクセスできませんでしたよ」という内容のメールがきて、「認証ファイルが外部からアクセス可能になる状態としてください。リダイレクトやアクセス制限などの設定を認証時のみでいいので一時的に解除してくださいね。」といった内容の指示を受けます。

環境

サイトのトップに.htaccessファイルを設置して、httpアクセスが来たとしてもhttpsのURLにリダイレクトする設定や、www付のドメイン名とwwwなしのドメイン名の両方でアクセスを受け付けるが、アクセスはwww付きで統一するためリダイレクトしている、と言うサイトが対象です。
このサイトでSSLサーバ証明書の更新時にファイル認証が実施される場合、サイト内に.well-knownディレクトリがよく使われるのですが、この.well-knownディレクトリへのアクセスでも.htaccessの影響でリダイレクトされるため前述のように認証ファイルにアクセスできないというエラーの連絡が届くことになります。
(たぶんhttpとhttps、wwwありとなしのURL全種類でアクセス可能であることが条件なので、リダイレクトを一時的に解除してくれ、とお願いされる。)

認証ファイルを配置するディレクトリは
.well-known/ディレクトリ/ファイル.txt
とします。

.htaccessを検討

単純に「.well-known/ディレクトリ/ファイル.txt」に置かれているファイルにアクセスが来た時だけ.htaccessの影響を受けないようにすればいいのかなと考えました。

そこでやってみたのが、トップに配置する.htaccessが以下のようなら、
--------------------------------------------------------------
RewriteEngine on
RewriteCond %{HTTP_HOST} ^%myDomainhoge%\.com
RewriteRule ^(.*) https://www.%myDomainhoge%.com/$1 [R=301,L]
RewriteCond %{ENV:HTTPS} !^on$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteBase /
--------------------------------------------------------------
サイトトップにある.htaccessの有効な文を全部コメントアウトした.htaccess
--------------------------------------------------------------

RewriteEngine on
#RewriteCond %{HTTP_HOST} ^%myDomainhoge%\.com
#RewriteRule ^(.*) https://www.%myDomainhoge%.com/$1 [R=301,L]
#RewriteCond %{ENV:HTTPS} !^on$
#RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteBase /

--------------------------------------------------------------
これを用意して、対象の「.well-known/ディレクトリ/ファイル.txt」と同列に配置してしまえばいいのかと思いました。

さっそく配置。

確認してみる

確認はキャッシュが残らないように注意して確認作業を実施します。

二種類の.htaccessが設置されたところで
http://www.%myDomainhoge%.com/.well-known/ディレクトリ/ファイル.txt

https://www.%myDomainhoge%.com/.well-known/ディレクトリ/ファイル.txt

https://%myDomainhoge%.com/.well-known/ディレクトリ/ファイル.txt
の3URLでhttpアクセスとhttpsアクセスの両方でテキストファイルが確認できました。

通常は、継承した.htaccessが有効なので、

f:id:treedown:20220221114821p:plain
httpsのwww付のURLがリダイレクトによって強制されますが、
除外用.htaccessを設置した後のディレクトリでは、

f:id:treedown:20220221114841p:plain
httpsのアクセスが可能になります。リダイレクトされなくなるので。(ただし、Firefoxのようにhttpsでアクセス可能な場合そっちを優先するブラウザもあるみたい。)
当然ですが、httpかつwwwなしのアクセスも

f:id:treedown:20220221114857p:plain
成功します。

重ねて動きを記載しておくと、ページトップの.htaccessを各ディレクトリでも継承しているので、httpがhttpsにリダイレクトされるのですが、除外したいディレクトリだけ全部無効化した.htaccessファイル(実態は空のファイルですが)を設置すれば、トップページの.htaccessの動作を継承しないことになります。

もっとスマートに

ここまでのように、「.htaccessがある階層だけ、違う制御になる」ということが分かりやすくなるように、リダイレクトを無効化した.htaccessを設置するように対処しましたが、.htaccessを散在させたくない場合には、トップページの.htaccessに一行追記して、今回の対象である「.well-known/ディレクトリ/ファイル.txt」の一番上のディレクトリ「.well-known」配下をすべてリダイレクトの除外対象としてしまうやり方もあります。

RewriteCond %{REQUEST_URI} !(^/\.well-known(.*)$)

どっちかというと、こちらのほうがスマートなのかなぁと思う一方で、.htaccessに詳しくない管理者との共同作業だとやっぱりリダイレクト無効な.htaccessを設置する方が分かりやすいかなぁと思いました。