ことれいのもり

.htaccessが読めるようになる!初心者向けのやさしい解説

はじめに

この記事は .htaccess ファイルを見ても何が書かれているか分からない人が、少し読めるようになるためのものです。

厳密な解説は他のサイトの方々にお任せして、初心者向けにまとめました。

.htaccessファイルとは?

.htaccessとは、Webサーバーのルールブックのことです。

特定のフォルダの中で「このルール通りに動けよ!!」と指示を出すファイルのこととも言えますね。

見て欲しくない部分にアクセス制限をかけたり、特定のURLに自動で転送する設定を記述できます。


具体的な例を挙げてみましょう。

  • アクセス制限:開発中のWebサイトを一般の人には見せずに、特定の人(開発者など)だけがアクセスできるようにする。
  • 自動転送:サイトをリニューアルしてURLを変えたので、古いURLにアクセスしても新しいページに飛ばしたい。

注意

この記事内で、.htaccessのコードの前に「php」とかかれています。

これはシンタックスハイライト用なので、phpと書かれていますが、phpのコードのことを意味しているわけではありません。

.htaccessファイルの読み方

.htaccessファイルの役割がなんとなく分かったところで、中身を見ていきましょう。

以下のコードは、存在しないファイルやディレクトリのアクセスを index.php に送るという処理をしている.htaccessです。


RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]


全体像はたったこれだけです。

では、一行ずつ見ていきましょう。

1行目

RewriteEngine On


URLを書き換えるエンジンである、mod_rewriteを有効にする宣言です。

「URL書き換えるときにはこの宣言が必要なんだな」ぐらいの認識で大丈夫です。

.htaccessファイルの一番上によく見かけるはずです。

2行目

RewriteBase /


先程URL書き換え設定をオンにしましたよね?

その書き換える基準となるパスの設定をここでしています。

「ここが基準なんだな」ぐらいの認識でOK

今回だと / なのでルートディレクトリが基準になります。

3~5行目の構造

ここからが.htaccessファイルのメイン部分です。 基本的な構造は、「条件に対して、指定したルールを適用する」という構造です。 下の画像を見てください。


.htaccessファイルの構造を説明する画像


赤枠で示した RewriteCond条件部分を表しています。

条件は複数行設定でき、全てAND(かつ)でつながれます。

青枠で示したRewriteRuleは、名前の通りルールです。

赤枠の条件を満たしたら「どうするのか?」を指定します。


多くの.htaccessファイルは赤枠の条件部分と青枠のルール部分をセットとして書かれています。

ここから再び各行の説明に戻ります。

3行目

RewriteCond %{REQUEST_FILENAME} !-f


RewriteCond は先程述べたとおり、条件を指定できます。


%{REQUEST_FILENAME} サーバー上のファイルのフルパスを指します。

一般的に、 %{定数} という決まった形でサーバーの情報を取得できます。

よく使われる記述方法ですね。

いくつか例を示しておきます。


%{REQUEST_FILENAME}    // サーバー上のファイルのフルパス 
%{REQUEST_URI}    // ユーザーがアクセスしたURLのパス 
%{REMOTE_ADDR}    // アクセスしてきたユーザーのIPアドレス 
%{HTTP_HOST}    // アクセスされたドメイン名 
%{HTTPS}    // HTTPSかどうか(onならHTTPS)


! は否定を表す、「~ではない」という意味です。

fは「そのパスに実際のファイルが存在するか?」をチェックするフラグです。

-f  // ファイルが存在するなら `true`
!-f // ファイルが存在しないなら `true`


よって、RewriteCond %{REQUEST_FILENAME} !-f の意味は、

「リクエストされたサーバー上のファイルのフルパスが存在しないならば、」という条件になります。

4行目

RewriteCond %{REQUEST_FILENAME} !-d


3行目と違うところは最後の部分が d になっているだけです。

d はディレクトリを意味します。

よって、この行の意味は、

「リクエストされたサーバー上のファイルのフルパスがディレクトリではないならば、」という条件になります。


3・4行目の条件部分をまとめると、

「リクエストされたサーバー上のファイルのフルパスが存在しない、かつディレクトリでないならば」という条件です。

5行目

RewriteRule ^(.*)$ /index.php [L]


RewriteRuleは適用するルールの部分です。

^(.*)$ の部分は正規表現と言われる記述方式で、様々な形式を記号のような形で表現できます。


^     // URLの先頭
(.*)  // 任意の文字列(全てのパス)をキャプチャ(捕まえて後で利用)する
$     // URLの終端


正規表現については長くなるので省略します。

ここでは、URLのパス部分を表しているという認識で大丈夫です。


/index.phpは、すべてのリクエストをindex.phpという場所に転送するという意味です。


[L] はLastという意味で、このルールが適用されたらそれ以降のルールは実行しないという意味です。


よって、この行の意味は

「全てindex.phpに転送する」という意味です。


すべてまとめると

3~5行目全てをまとめると、


RewriteCond %{REQUEST_FILENAME} !-f  // 【条件】リクエストされたサーバー上のファイルフルパスが存在しない
RewriteCond %{REQUEST_FILENAME} !-d // 【条件】ファイルのフルパスがディレクトリでない
RewriteRule ^(.*)$ /index.php [L]  // 【ルール】index.phpに転送する


「リクエストされたサーバー上のファイルのフルパスが存在しない、かつディレクトリでないならば全てindex.phpに転送する」

という処理になります。

少しは読めるようになりましたか?

より深く理解するなら

勘の良い方なら「RewriteRuleでキャプチャした部分はどこで使うの?」と疑問に思うかもしれません。

今回は使いませんでしたがRewriteRuleでキャプチャした部分は、新しいパスとして組み込んでリダイレクトなどに利用できます。

複数のキャプチャグループを使うことで色々な表現が出来るようになるので、調べてみてくださいね!

おすすめの記事

ここまでの説明でなんとなーく分かったと思います。(完璧に分からなくてもOK)

私も最初は意味不明だったので大丈夫です!


初心者でも分かりやすいようなおすすめの記事をいくつか載せておくので、参考にしてください。

いろんな記事を見ることで少しずつ理解が深まっていきますよ!


htaccessの基本知識と使い方【初心者向け】:https://www.otwo.jp/blog/use-htaccess/

  • ゲーム会社の株式会社オーツー様が書かれている記事です。
  • .htaccessを使った処理の例がのっています。


WordPressの「.htaccess」を読み解く:https://jobtech.jp/wp/2035/

  • WordPressに記載されているファイルを読み解く記事です。
  • 私がさらっと流したRewriteCondなどの詳細な記述方法も書かれています。

おわりに

初心者でも分かりやすいように、できるだけかみ砕いて.htaccessファイルの説明をしてみました。

私自身、.htaccessファイルの意味が本当に分からなくて困ったので、過去の自分に向けて書いたつもりです。

この記事だけで全て分かるということはないでしょうが、一つの気づきになれれば幸いです。