joppot

コピペで絶対動く。説明を妥協しない

サーバ

apacheのmod_rewriteでphpのGETパラメータのurlを書き換える

投稿日:


apache_php_url_top_thumb

概要

みなさんこんにちはcandleです。今回はphpでgetでパラメータを受け取る際のurlの書き換えです。
例えば、phpよくあるのがこのようなurlではないでしょうか。

http://localhost/index.php?page=1&keyword=cat

これはもちろん、直感的にわかりやすいのですが、phpの拡張子や、?とか&がかっこ悪いです。
これを最終的には

http://localhost/page/1/keyword/cat

http://localhost/1/cat

にしてみたいと思います。

seo的にはどうかというのは検証していません。

前提

適当なapacheがある。
私はvagrantのcentos6.5のapache2.2でやりますが、apacheであればどれでも構わないでしょう。


準備

centosではapacheの公開ディレクトリであるdocument rootは/var/www/htmlになっているので、そこを使用します。ubuntuやmacでは少々変わると思いますが、それぞれ探してください。

/var/www/htmlにindex.phpを作成します。

cd /var/www/html/
sudo touch index.php

create_index_php

index.phpを開いて、以下を記述します。

<?php
print_r($_GET);
?>

これで、どのようなGETパラメータが飛んできているか確認できます。

1つのパラメータのルーティング

まずは

http://lolcalhost/index.php?page=1

http://localhost/page/1

にします。

/etc/httpd/conf/httpd.confを開きます。

今回はわかりやすく、 DocumentRootの下に記述していきます。

DocumentRootの記述を探して、以下を記述しましょう。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/page/([0-9]+)$ /index.php?page=$1 [NC]
</IfModule>

([0-9]+)は数字なら、何文字でもいいよという意味です。それを$1に投げてphpが受け取ります。

rewrite_url_one_param

保存して、httpd サーバを再起動します。

sudo service httpd restart

サーバにアクセスすると、以下のようなルーティングになっていますね。

localhost_page_1_param

GETにどのような値が来ているか確認できます。[page] =>1

2つのGETパラメータを受け取る

2つ受け取りたい場合は様々な方法がありますが、上の定義にのっとってやれば、下のようなルーティングにしてみます。

http://lolcalhost/index.php?page=1&keyword=てんぷら

http://localhost/page/1/keyword/てんぷら

httpd.confを以下のように書き換えます。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/page/([0-9]+)/keyword/(.+)$ /index.php?page=$1&keyword=$2 [NC]
</IfModule>

php_get_two_param-1

(.+)は文字は何文字でなんでもいいよという意味です。それを$2に投げてphpが受け取ります。

サーバーを再起動したら、以下のurlにアクセスすると、phpは2つのgetを受け取れます。

http://localhost/page/1/keyword/てんぷら

get_two_param_apache

短い2つのパラメータを受け取るルーティング

urlにpageやkeywordが入るのが邪魔な場合は以下のようにすれば、短いルーティングが可能です。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/([0-9]+)/(.+)$ /index.php?page=$1&keyword=$2 [NC]
</IfModule>

short_url

以下にアクセスするとGETの値が取得できます。

http://localhost/1/てんぷら

short_apache_two_param_url

まとめ

上記のような方法で、ルーティングを細かく行えば、php単体のサービスでも綺麗なurlを作成できます。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ
-,

執筆者:


comment

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

関連記事

wordpressをnginxでsubdirectoryに配置する

概要 みなさんこんにちはcandleです。 今回はnginxを使って、サブディレクトリにwordpressを配置してルーティングを行う方法を紹介します。 実はこれ、結構苦労しました。わりと文献はあるの …

awsのec2上でredmineをnginxで使用する方法

概要 みなさんこんにちはcandleです。今回はredmineをec2上で使用する方法を紹介します。 redmineはrailsで作られたwebアプリケーションです。railsで作られているということ …

AWSのLoad Blancer越しのアクセスをapacheのカスタムログを使用して取得し、かつfluentdで取得する方法

概要 みなさんこんにちはcandleです。今回はELB越しのapacheのアクセスをカスタムログを使用した場合にfluentdで如何にして取るかを紹介します。 fluentdがapacheのacces …

railsのfluent-logger gemを使ってユーザーのアクセスをfluentdサーバに収集する

概要 みなさんこんにちはcandleです。前回からfluentd関連の記事を続けていますが、今回辺りから実用的な使い方を書いていきたいと思います。 fluentdと言えば、ビックデータで扱うようなデー …

centos6.5にtd-agentサーバを構築する

English 日本語 概要 みなさん、こんにちはcandleです。 今回はcentos6.5にtd-agentサーバを構築してみたいと思います。 td-agentとは要はfluentdの事だと思いま …

  • English
  • 日本語

ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー