skillup

技術ブログ

サーバー・ネットワーク

mod_rewriteについて

投稿日:2017年6月1日 更新日:

本日はapacheのmod_rewriteについて。

例えばget句に郵便番号を付けて、住所を出力するWEBプログラムがあるとします。

この場合、そのままだと http://sampledomain.com/sampleapp/public/address.php?zip=1048404 ですが、こういったURLを http://sampledomain.com/sampleapp/public/address/1048404 でアクセスしたいとします。

こんな時に必要になるのが http://sampledomain.com/sampleapp/public/address/1048404 でアクセスし、内部で http://sampledomain.com/sampleapp/public/address.php?zip=1048404 と書き換える機能です。

これはapacheのmod_rewriteというモジュールで行います。

Apache2.4系を前提に説明します。(検索するとこれ以前のものが多く出てきますんで逆に2.4以前のものの情報には困らないかと思います。)

一応過去のブログを参考リンクに。
サーバー設定ファイルについて apache

mod_rewrite

/etc/httpd/conf.modules.d/00-base.conf

ここに下記のようにモジュールが組み込まれていればOKです。

あとはphpinfoで見て、Loaded Modulesのなかにmod_rewriteが書かれていればOKです。

デバッグ

URLのrewriteの場合、プログラムと違って中がどうなっているのかを把握するのが難しいので情報をログから取るしかありません。ログへの出力の抑制などは下記を/etc/httpd/conf/httpd.confにかいてあげればOKです。

※注意点としては先ほどのmodule読み込みよりも後に書かないと反映されません。

またどのくらいの情報を出力できるかをコントロールできます。出力レベルはdebug~emergeまであります。具体的には下記を参照

http://httpd.apache.org/docs/2.4/ja/mod/core.html#loglevel

またrewriteの情報も出力レベルが1~8まであり、数字が大きいほど詳しいです。

ログのパスなどは2.4系では自動的にapacheのerror_logに吐かれます。また具体的なURLのrewriteはアプリのディレクトリ直下に.htaccessをおいてこれで管理することがほとんどですので、.htaccessが機能するようにしておきましょう。

.htaccess

具体的なrewriteなどはアプリのディレクトリ直下のhtaccessに記述することが多いです。

今回のケースの場合、 /var/www/html/sampleapp/public/address.php にプログラムがあるとすると、htaccessのパスは /var/www/html/sampleapp/.htaccess になります。

ここで下記のように記述します。

具体的なrewriteのルールを知りたい場合は以前も紹介しましたが、下記のリンクが詳しいです。

.htaccess の書き方

Apacheのmod_rewriteモジュールの使い方を徹底的に解説

【mod_rewrite】 RewriteBaseとは?

ログには具体的に下記のようにリダイレクトが吐かれます。リダイレクトがうまくいっていないときはここで一回一回確認しましょう。

mod_rewriteのウェブサービス

まだリダイレクトをすぐに調べられるサービスもあるようなのでこれを活用するのもいいと思います。

Mod Rewrite Generator
まずはサンプルのURLをいれて挙動を確認してみましょう。.htaccessを自動で吐いてくれます。

Test your htaccess rewrite rules

get句を含んだURLとhtaccessの記述内容に合致しているかをすぐに判定してくれます。いちいちブラウザをたたくよりこっちのほうが便利かも・・

注意点

htaccessの場合、一度設定するとブラウザがキャッシュしてしまい、書き換えてもなかなか反映されないことが多いです。

その場合、ただのリロードや一般的なリロード(F5/Ctrl+F5)では解決しないことが多いです。

chromeでは以下のステップでキャッシュをクリアできます。

  • F12で開発ツールを出す
  • URLバーの横にあるマークを長押し
  • キャッシュの消去とハードの再読み込み

【Chrome】ブラウザの頑固なキャッシュを完全に削除するスーパーキャッシュクリア方法

ちなみにIEとfirefoxでは地道に設定画面からキャッシュをクリアするしかないようです。メンドイ・・・

-サーバー・ネットワーク
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

ファイルアップロード・ダウンロードに関するシェルスクリプト

ファイルのアップロードやダウンロードに関するシェルスクリプトなんぞを。 地味ですが、以外に登場頻度は高いかと。 Contents1 FTP1.1 ダウンロード1.2 アップロード2 SCP2.1 アッ …

no image

IaC(Infrastructure as Code)に関して

近年ではインフラ環境もコード化しておいて、コマンドで起動や構築できることが一般的ですね。 ansibleやdockerなどは色々と使っていましたが、実際のインフラ環境では2020年6月現在AWSを使う …

no image

正規表現その2

10/28に書いた正規表現に関しての追記です。 Contents1 覚えておきたいメタ文字2 留意点 覚えておきたいメタ文字 よく出るメタ文字の復習です。 メタ文字 メタ文字の説明 [] いずれかの1 …

no image

linuxでのherokuのインストール&パスの通し方

linuxでのherokuのインストールやパスの通し方について 原則としてruby入ってないとダメっぽいです。(しかもruby1.8系だと2016年6月現在エラーが出ますので最新バージョンをインストー …

no image

firewall復習 ansibleコマンドもかねて

CentOS7ではファイアーウォールの設定をfirewallというコマンドで行います。要はportのブロックですね。 以前下記リンクでもfirewallについて書いたんですが、あまり理解もできていなか …

アーカイブ