.htaccess で mod_rewrite を使う
Apache HTTP Server や LiteSpeed Web Server を使用している環境において、『http://hostname/demo/~
というURLリクエストは全て demo/index.php
に処理させたい…』とか『URLにphpファイル名を表示したくない』という時は .htaccess ファイル で mod_rewrite モジュール を使います。
URL書き換えの例:http://hostname/index.php?a=b
→ http://hostname/?a=b
http://hostname/search.php?kwd=hoge
→ http://hostname/search/hoge
.htaccess
を利用可能にするには、Webサーバの設定で AllowOverride ディレクティブ に All を設定設定します。
ご紹介するのは『アクセスされたURLが http://hostname/demo/hoge/fuga
でも http://hostname/demo/foo/bar/123
でも http://hostname/index.php
に処理させる』という時の .htaccess の書き方の例です。
構築したシステムを公開するディレクトリに .htaccess というファイルを作成し、以下のように記載することで、そのディレクトリにある index.php
にリクエストを飛ばすことが出来ます。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.(png|jpg|jpeg|webp|svg|gif|bmp|tiff|ico|css|js)$ - [L]
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
この例では、画像やCSS、JavaScript へのリクエストは index.php
に飛ばさないようにしています。
各行の内容については、以下で解説します。
解説
RewriteEngine On
『RewriteEngine On
』 は「URL書き換えエンジンON!」という意味です。これがなくては始まりません。
RewriteCond %{REQUEST_FILENAME} -f
『RewriteCond
』 は次の行の『RewriteRule』の 適用条件 となります。
『%{REQUEST_FILENAME}
』 はリクエストを受けたファイル名です。
『-f
』 は「ファイルが存在する場合」という意味です』
以上をまとめると、「存在するファイルがリクエストされた場合、次の RewriteRule を適用する」という意味になります。
RewriteRule .(png|jpg|jpeg|webp|svg|gif|bmp|ico|css|js)$ - [L]
『RewriteRule』はURL書き換えルールです。
『.(png|jpg|jpeg|webp|svg|gif|bmp|ico|css|js)$
』の正規表現で「画像/スタイルシート/JavaScriptの拡張子を持つファイル」を表しています。
正規表現の次の文字列は書き換え後のURLです。
ここでは書き換え後のURLがハイフン(-
)になっていますので「URLの書き換えは行わない」ということなります。
そして最後に『[L]
』が付いていると、以後の RewriteRule に該当しても、この行のルールが適用されるようになります。
以上で「存在する画像/スタイルシート/JavaScriptのファイルに対してはURLの書き換えは行わない」という条件が完成します。
例では拡張子でマッチさせていますが、ディレクトリ名でマッチさせるのもスマートな書き方で、CakePHP 3 のマニュアルではディレクトリ名でマッチさせる RewriteRule が書かれています。
ディレクトリ名でマッチさせると、扱う拡張子が増えた際に .htaccess の修正が必要ないというメリットがあります。
RewriteRule ^(.*)$ index.php?/ [QSA,L]
『QSA
』は必須です。QSA
を付けないとURLパラメータが無視されてしまいます。
(リクエストが http://hostname/demo?kwd=hoge
なら ?kwd=hoge
の部分が無視されてしまいます。 )
『^(.*)$
』は全ての文字列にマッチする正規表現です。
『index.php?/$1
』は書き換え後のURLです。
『$1
』は正規表現で丸括弧の部分にマッチした文字列で置き換えられます。
このように記載した .htaccess
を http://hostname/demo/
の下に置くと、例えばアクセスされたURLが http://hostname/demo/test/hoge
なら http://hostname/demo/index.php?/test/hoge
にアクセスされたものとして処理されるようになります。
なお、この index.php
では受け取ったURLから要望を理解して処理を行う必要があります。
まとめ
.htaccess
の mod_rewrite
を利用すると、WEBサーバ内部で扱われるURLを書き換えることができます。
一見すると難解な設定に思えるかもしれませんが、正規表現が読めれば結構簡単に読めるので、ご紹介した設定ファイルの内容が難しいと感じた方は、まず正規表現のトレーニングを行うことをお勧めします。
以上、この情報がお役に立てれば幸いです。