レンタルサーバ

さくらインターネットの共用サーバで .htaccess にOptionsの設定ができるようになった

さくらインターネットの共用レンタルサーバで、このたび.htaccessOptionsが使えるようになったそうです※1。10年以上使ってきて安定感もあってクライアントにオススメする第一候補としてるさくらの共用サーバですが、Optionsが使えない件は不評だったみたいだし自分もたまに不便に感じることもありました。

メンテナンス・障害情報・機能追加|さくらインターネット公式サポートサイト

1. AllFollowSymLinksは使えません。

そういうわけで、今までは「さくらインターネットのレンタルサーバ」用の.htaccessを書いていたわけですが、これからは他のサーバと同じように書けそうです。まだ他にもOptionsが使えないサーバもあるかもしれないので、一応今まで書いていたものの保存ついでにメモとることにしました。

Indexes/ディレクトリ一覧

今までのさくらのレンタルサーバでは、ディレクトリ内のファイルの一覧「Index of」を表示する自動インデックス機能がデフォルトで「有効」だったんですが、今回の変更によって「無効」がデフォルトになったそうです。これまでファイル一覧の表示をアテにしていたディレクトリは、これからは自動インデックス機能を「有効」に設定する必要があります。

自動インデックス(ディレクトリ内のファイル一覧の表示・非表示)
# 自動インデックス機能:有効 ※一覧を表示
Options Indexes
# または
Options +Indexes

# 自動インデックス機能:無効(デフォルト) ※一覧を非表示
Options -Indexes

以前はOptionsが使えなかったので、ファイル一覧を表示したくない場合はディレクトリのインデックスページを設定するDirectoryIndexを使って、「インデックスページが無ければエラーページへ移動」する設定にしていました。

ディレクトリにインデックスページが無ければエラーページへ移動する
# ディレクトリに「index.html」「index.shtml」「index.php」「index.cgi」の
# いずれもない場合はルートにあるエラーページ「403」へ移動する
DirectoryIndex index.html index.shtml index.php index.cgi /403

MultiViews/コンテントネゴシエーション

MultiViews機能は、URLに拡張子が指定されなくてもコンテントネゴシエーションを行なって適当にファイルを判断してくれる機能です。引き続き「有効」がデフォルトだと思いますが、今まではOptionsが使えなかったのでこの機能をオフにできませんでした。

コンテントネゴシエーションが行われると、例えば「/topics/01.html」へは「/topics/01」でアクセス出来たりします。この場合、拡張子のないリンクが使えるので、ファイル名が01.php01.cgiに変わってもURLを変えずに済みます。便利な半面、同名の画像やディレクトリが存在する場合のために有効な拡張子や優先順位の設定をするなど対応が必要な場合も出てきます。必要なければ無効にしておいてもいいと思います。

MultiViews機能
# MultiViews機能:無効 ※拡張子の省略無効
Options -MultiViews

# MultiViews機能:有効(デフォルト) ※拡張子の省略有効
Options MultiViews
# または
Options +MultiViews

MultiViews機能によって、「/topics/index」のようなアクセスも/topics/index.html/topics/index.phpを表示するので、インデックスページのURLを「/topics/」に統一する設定にこの辺りの対応も含めていました。「/topics/index/」のようなディレクトリがあった場合にうまくやらないといけなかったりして話がややこしく面倒なので、既存のページに問題がない人はMultiViewsは切ってしまってもいいかもしれません。

インデックスページ(index.htm, index.html, index.shtm, index.shtml, index.php, index.cgi )へのアクセスをスラッシュ終わり(ファイル名のないもの)に統一する
<IfModule mod_rewrite.c>
RewriteEngine on

# 拡張子がないURLもスラッシュ終わりのURLに統一する
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*/)?index(?:.s?html?|.php|.cgi)?$ $1 [R=301,L]
</IfModule>

ExecCGI, Includes/CGI、SSI

何かの事情によってCGISSIを無効にしたい場合、Optionsで可能になりました。CGIを無効にすると、該当ファイルはアクセスエラーになります。SSIを無効にするとSHTML内の実行文はただのHTMLコメントになります。

CGI、SSIを無効にする
# CGI無効
Options -ExecCGI

# SSI無効
Options -Includes

さくらインターネットのサーバ設定には今まで悩むこともありましたが、これからはラクになりそうです。また何か思いついたら記事にしたいと思います。