hiramas’s blog

気になったことをちゃんと調べてみようってブログ

HTTP:X-SAKURA-FORWARDED-FORってなんだ?

httpからhttpsにリダイレクトさせるこの処理

RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://domain/$1 [R=301,L]

は、さくらのレンタルサーバーを利用している人の間ではあまりにも有名なおまじないです。

また同時に、これほど、コピペのまま使わている処理もないでしょう。
このコードを一層分けわからなくさせているのが、2行目の
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
です。サーバー変数が空の場合除外するだろうこと以外はほぼ意味不明です。
今回はこの2行目の処理について解説します。
 
ざっくりこの2行目の『機能』としては受け取ったHTTPリクエストの中の

X-Sakura-Forwarded-For
というヘッダーの中身が空でなければ、3行目の対象になるというものです。

 

2行目がある『理由』

では前述した機能がなぜ、さくらサーバーにおいて、httpsのアクセスのフラグになり得るのか?
 
それは、さくらサーバーがリバースプロキシと呼ばれる仕組みを使ってSSL通信を実現しているからです。
 
リバースプロキシとは、簡単に説明すると、
ファイルが置いてあるサーバーとは別に、関所のように別のサーバーを必ず経由させるとき、この関所の働きをするサーバーをリバースプロキシと呼びます。
  さくらサーバーでは暗号通信を担うサーバー(リバースプロキシ)が最初にアクセスを受け、その後、実際にファイルのあるサーバーにアクセスする仕組みを採用しています。
 
ここで特に注意したいのが、.htaccessが読み込まれるタイミングは実ファイルが格納されているサーバーにアクセスがあったときであり、.htaccess的にはリバースプロキシサーバーからの通信となるわけです。
 
感の鋭い人はもうわかったのではないでしょうか?
 
つまり、リバースプロキシサーバーからのHTTP通信のヘッダーに
X-Sakura-Forwarded-For
が記載されているのです。
 
ちなみにこの
X-Sakura-Forwarded-For
は、AddHeaderと呼ばれる機能でサーバー側で別途設定しなければ生成されないヘッダーです。
X-Forwarded-Forと呼ばれるヘッダーの亜種なのですが、役割や、詳しい説明は
下記を参照してください。

2行目の『意味』

つまり、この記載をより意味に即して説明するならば、
このアクセスの途中にSSL通信を担うリバースプロキシを通っていれば、
次の行の処理をする
というコードになります。