[.htaccess] 条件に該当するURLを書き換える [mod_rewrite]

.mod_rewrite でURLを書き換える 開発/PG

.htaccess で mod_rewrite を使う

Apache HTTP ServerLiteSpeed Web Server を使用している環境において、

『”http://hostname/demo/~” というURLリクエストは全て “demo/index.php” に処理させたい…』

『”http://hostname/index.php?a=b” や “http://hostname/search.php?kwd=hoge” って感じのURLはいやだから “http://hostname/?a=b” や “http://hostname/search/hoge” って感じのURLにしたい…』

といった時は .htaccess ファイルmod_rewrite モジュール を使います。

.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』は正規表現で丸括弧の部分にマッチした文字列で置き換えられます。

このように記載した .htaccesshttp://hostname/demo/ の下に置くと、例えばアクセスされたURLが http://hostname/demo/test/hoge なら http://hostname/demo/index.php?/test/hoge にアクセスされたものとして処理されるようになります。

なお、この index.php では受け取ったURLから要望を理解して処理を行う必要があります。

まとめ

.htaccessmod_rewrite を利用すると、WEBサーバ内部で扱われるURLを書き換えることができます。

一見すると難解な設定に思えるかもしれませんが、正規表現が読めれば結構簡単に読めるので、ご紹介した設定ファイルの内容が難しいと感じた方は、まず正規表現のトレーニングを行うことをお勧めします。

以上、この情報がお役に立てれば幸いです。

タイトルとURLをコピーしました