【Apache】RewriteRuleでパラメータを引き継がない方法【さよなら.htaccess】

こんにちは。

今回は、ApacheでRewriteRuleを使ってリダイレクトの制御をする際、遷移元URLのクエリパラメータを引き継がないようにする方法を紹介します。.htaccessは使わないようにしよう!という話もします。

Apacheでのサーバー設定管理

Apache(Apache HTTP Server)ではサーバーの設定をhttpd.confファイルや.htaccessファイルに記述できます。Apacheのインストール場所から静的ドキュメントの配置場所、ディレクトリごとのアクセス制限など様々な設定ができますが、使わないようで意外とよく使うのがリダイレクトの設定です。

リダイレクト設定時のパラメータ引き継ぎ

あるページへのリクエストを別のページにリダイレクトしたい場合、RewriteRuleディレクティブを用いて記述しますが、遷移元URLにクエリパラメータが付いている場合、意識しないと遷移先にそのまま引き継いでしまいます。

例えば、https://example.com/hoge/以下のURLをhttps://example2.com/fuga/にリダイレクトさせたいとき、次のように記述します。

RewriteEngine On

RewriteRule ^hoge/.* https://example2.com/fuga/ [R=301,L]

こうすると

遷移元URL 遷移先URL
https://example.com/hoge/ https://example2.com/fuga/
https://example.com/hoge/piyo https://example2.com/fuga/
https://example.com/hoge/piyo?foo=bar https://example2.com/fuga/?foo=bar

このような遷移になります。2つ目までは良さそうですが、3つ目が想定外です。一律でhttps://example2.com/fuga/にリダイレクトさせたかったはずが、不要な遷移元URLのクエリパラメータが付いてしまっています

パラメータを引き継がないようにする方法

こういった場合にクエリパラメータを引き継がないようにするには、遷移先URLの末尾に?を付けます

RewriteEngine On

RewriteRule ^hoge/.* https://example2.com/fuga/? [R=301,L]

こうすることで、

遷移元URL 遷移先URL
https://example.com/hoge/ https://example2.com/fuga/
https://example.com/hoge/piyo https://example2.com/fuga/
https://example.com/hoge/piyo?foo=bar https://example2.com/fuga/

このような遷移になり、遷移先にクエリパラメータを引き継がないようにすることができます。URL内でクエリパラメータの始まりを表す?を付けるとパラメータが引き継がれなくなるというちょっとややこしい感じですが、このような決まりになっています。

.htaccessは使わないようにしよう

余談ですが、Apacheでは各種設定はhttpd.confファイルに記述することが推奨されています。分散型の設定ファイルである.htaccessファイルに記述することもできますが、自分がサーバーの管理者であるならhttpd.confファイルを利用しましょう。

公式のドキュメントにも

You should avoid using .htaccess files completely if you have access to httpd main server config file. Using .htaccess files slows down your Apache http server. Any directive that you can include in a .htaccess file is better set in a Directory block, as it will have the same effect with better performance.  

とあります。

つまり、.htaccessを使うとサーバーの動作が遅くなるうえに、httpd.confで全く同じ設定ができるので得することがないということです。レンタルサーバーのようにユーザーにアクセス制御などの設定をできるようにしつつ権限は絞りたい、というときには有効なものですが、自分が管理者であればサーバーの設定が分散して分かりにくくなるうえに動作が遅くなるくらいなら、1箇所で管理したほうが良いでしょう。

ちなみに.htaccessを使うデメリットとして複数ユーザーで管理する際に権限管理が面倒になることもありますが、メインはパフォーマンスの問題です。httpd.confファイルはサーバーの起動時に1回だけ読み込まれますが、.htaccessはサーバーへのリクエストのたびに読み込まれます。そして実際にリクエストのあったディレクトリだけでなく、その親子ディレクトリ全ての.htaccessを探します。これを毎回やっているわけなので遅くなるのは当然です。なお、実際には.htaccessを使っていなくても、AllowOverrideディレクティブで.htaccessが使えるように設定してあるだけで.htaccessを探しに行ってしまいパフォーマンスが落ちるので、使う気がないなら設定しないように気をつけましょう。


というわけで今回は、RewriteRuleでクエリパラメータを引き継がない方法と、.htaccessを使うのはやめようという話でした。最近NginxのシェアがApacheを超えたことが話題になっていましたが、徐々にApacheは使われなくなっていくのでしょうか。ちなみにパン工房のサーバーもNginxです。

それではまた。

関連記事