Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Remove index.php in Apache URL Using .htaccess

2025年09月11日に「Dev.to」が公開したITニュース「Remove index.php in Apache URL Using .htaccess」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ApacheでURLから「index.php」を削除し、短くきれいなURLにする手順。mod_rewriteを有効化し、VirtualHost設定でAllowOverride Allを許可。プロジェクトのルートに.htaccessファイルを作成し、URL書き換えルールを記述する。これにより「domain.com/index.php/tes」が「domain.com/tes」として利用できる。

ITニュース解説

Webアプリケーションを開発する際、ウェブサイトのURLはユーザーにとってサービスの顔とも言える重要な要素だ。ウェブサイトのアドレスがシンプルで分かりやすいことは、ユーザー体験の向上や検索エンジン最適化(SEO)に大きく貢献する。特にPHPなどのサーバーサイドプログラミング言語で構築されたアプリケーションでは、デフォルトのURLに「index.php」というファイル名が含まれることがよくある。例えば、「http://domain.com/index.php/tes」のような形式だが、これを「http://domain.com/tes」のように、よりすっきりとしたURLにしたいと考えるだろう。多くのモダンなウェブフレームワークではこの処理が自動的に行われるが、そうでない環境や、より基本的な仕組みを理解したい場合には、この「index.php」をURLから削除する設定を自分で行う必要がある。この設定は、ウェブサーバーであるApacheの「mod_rewrite」という機能と、「.htaccess」という設定ファイルを利用して実現する。

まず、このURLの書き換え機能を使うためには、Apacheサーバーで「mod_rewrite」モジュールが有効になっている必要がある。mod_rewriteは、Apacheが持つ強力な機能の一つで、受信したURLのリクエストを別のURLに書き換える(リライトする)ことを可能にする。例えば、ある特定のURLへのアクセスがあったときに、実際にはサーバー内部の別のファイルやスクリプトを呼び出すように設定できるのだ。このモジュールを有効にするには、サーバーのコマンドラインインターフェースで「sudo a2enmod rewrite」というコマンドを実行する。このコマンドは、Apacheのrewriteモジュールを有効化するためのシンボリックリンクを作成する役割を持つ。その後、「sudo systemctl restart apache2」コマンドを実行してApacheサービスを再起動することで、変更が適用され、mod_rewriteが利用可能になる。

次に、Apacheがウェブサイトのディレクトリごとに設定を上書きすることを許可するように設定を変更する必要がある。ウェブサイトの全体的な設定は、通常「VirtualHost」というブロックで定義されている。このVirtualHostの設定ファイルは、「/etc/apache2/sites-available/domain.conf」のようなパス、あるいはデフォルト設定の「/etc/apache2/sites-available/000-default.conf」などに存在することが多い。このファイル内で、ウェブアプリケーションが配置されているディレクトリ(例えば「/var/www/html/api」)に対して、「AllowOverride All」という設定を追加する。これは、そのディレクトリ内に配置された「.htaccess」というファイルで、Apacheのデフォルト設定を上書きすることを許可するという意味だ。「.htaccess」ファイルは、ディレクトリ単位でウェブサーバーの動作を細かく制御するための特別な設定ファイルで、URLリライトのルールを記述する際に非常に重要となる。この設定を追加することで、個別のプロジェクトやディレクトリごとに、特定のルールを適用できるようになるのだ。設定を追加したら、「systemctl reload apache2」コマンドを実行してApacheをリロードする。リロードはApacheサービスを完全に停止せず、設定の変更を読み込ませる安全な方法だ。

最後に、実際にURLを書き換えるためのルールを「.htaccess」ファイルに記述する。このファイルは、ウェブアプリケーションのルートディレクトリ、例えば「/var/www/html/api」に作成する。もし既に存在しない場合は、手動で「.htaccess」という名前でファイルを作成する。ファイルの中には、以下のルールを記述する。

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

それぞれの行が持つ意味を説明する。「RewriteEngine On」は、このディレクトリでURLリライト機能を有効にするための宣言だ。「RewriteBase /」は、リライトの基準となるパスを設定する。ここでは、ウェブサイトのルートディレクトリが基準となることを示している。続く二行「RewriteCond %{REQUEST_FILENAME} !-f」と「RewriteCond %{REQUEST_FILENAME} !-d」は、リライトを行うための条件を指定する。「RewriteCond」は条件式を示すディレクティブで、「%{REQUEST_FILENAME}」はリクエストされたURLに対応するサーバー上のファイルパスを表す。「!-f」は「もしそのパスにファイルが存在しないならば」という条件を意味し、「!-d」は「もしそのパスにディレクトリが存在しないならば」という条件を意味する。つまり、これらの二行は、「リクエストされたURLが、サーバー上の実際のファイルやディレクトリに対応していない場合のみ、リライトを実行する」という条件を設定している。例えば、「http://domain.com/image.jpg」というURLがリクエストされた場合、もし「image.jpg」というファイルが実際に存在すれば、リライトは行われず、そのままファイルが返される。しかし、「http://domain.com/tes」というURLがリクエストされ、対応する「tes」というファイルもディレクトリも存在しない場合、次のRewriteRuleが適用される。最後の行「RewriteRule ^(.)$ index.php?/$1 [L]」が、実際にURLを書き換えるルールだ。「RewriteRule」はリライトのパターンと置換後のURLを指定するディレクティブで、「^(.)$」は正規表現で、リクエストされたURLパス全体(最初のスラッシュ以降のすべて)をキャプチャする。キャプチャされた内容は「$1」で参照される。このルールは、「リクエストされたURLがファイルでもディレクトリでもない場合、そのURLパス全体を『index.php?/』の後に付けて、内部的に『index.php?/tes』のように書き換える」ことを意味する。これにより、ブラウザには「http://domain.com/tes」と表示されながらも、Apacheの内部では「index.php」が実行され、その後のパス情報(例:「tes」)がPHPスクリプトに渡される。末尾の「[L]」フラグは、「このルールが適用されたら、それ以降のリライトルールは処理しない(Last rule)」ことを示す。

これらの設定が完了したら、再度「systemctl restart apache2」コマンドを実行してApacheサービスを再起動する。これにより、.htaccessファイルの変更がApacheに完全に認識され、新しいURLリライトルールが有効になる。 設定が正しく行われたかを確認するには、ブラウザで「http://domain.com/index.php/tes」のような元のURLにアクセスしてみる。正しく設定されていれば、このURLは「http://domain.com/tes」という形式でアクセスできるようになっているはずだ。このようにして、ウェブアプリケーションのURLから「index.php」を削除し、よりクリーンでユーザーフレンドリーなURLを実現できる。この方法は、URLの構造をシンプルにするだけでなく、アプリケーションの柔軟性を高める上でも非常に役立つ。システムエンジニアとしてこのようなURLリライトの仕組みを理解することは、ウェブアプリケーション開発において不可欠な知識となるだろう。

関連コンテンツ