2015年02月01日

mod_rewriteでURIを変更せずに静的ページを動的ページにしたり、ホスト名の変更などに対応

最近、mod_rewriteでURIを変更せずに静的ページを動的ページにしたり、ホスト名の変更などにすることがあったので、そのときのメモ

・サーバーやコンテンツを変更せず、あるサイトに新しいドメインを割り当てて、古いドメインでのアクセスを新しいドメインにリダイレクトさせる場合

以下の2つのホスト名が設定されている場合
・www.example.com (今まで使用していた方)
・www.example.net (新しい方)

この場合、mod_rewriteを使い、”.htaccess”に以下のように記述します。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule .* http://www.example.net%{REQUEST_URI} [R=301,L]

%{HTTP_HOST}, %{REQUEST_URI} は、http://www.example.com/test/index.htmlの場合以下のようになります。
%{HTTP_HOST} = www.example.com
%{REQUEST_URI} = /test/index.html

[・・・]の指定は以下のような意味になります。
NC   RewriteCondの判定で大文字、小文字の区別をしません。
R=301 HTTPステータスコード301(Moved Parmanently)でリダイレクト
L   条件にマッチした場合は、[L]の行で実行が停止します。


・ある特定のページを別のページにリダイレクトさせる場合、以下のようにします。
RewriteEngine on
RewriteRule ^/server/test.html$ http://www.example.net/client/test.html [R=301,L]

ただし、バーチャルホストを使用していると、上記でリダイレクトしない場合があります。
原因は条件”^/…$”の先頭にある”/”になります。
この場合は、”^/?…$”にして先頭の”/”が無しでもマッチするようにします。
RewriteEngine on
RewriteRule ^/?server/test.html$ http://www.example.net/client/test.html [R=301,L]

参考
ApacheのRewriteRuleで検索条件に^/がマッチしない場合がある理由


・特定の拡張子のときだけを遷移させる場合、例えば、拡張子が.htmlの静的ページを、URIは変更せずにPHPの動的ページにするような場合
RewriteEngine On
RewriteCond %{REQUEST_URI} \.html$
RewriteRule (.*) /index.php?uri=$1 [L]

ここでは2行目で拡張子".html"のリクエストだけを対象に指定しています。
3行目でリクエストのURIをパラメータとして "/index.php" にアクセスするようにしています。
さらに、最後の[L]にRが無いため、ブラウザに表示されるURIの変更なしに動的ページとなります。

例 http://www.example.com/test/hello.html でアクセスすると、クライアントには分からないように http://www.example.com/index.php?uri=/test/hello.html が実行され、その結果が返されます。

参考
Apache Module mod_rewrite
posted by jun1 at 21:44| Comment(0) | TrackBack(0) | Web

2014年12月05日

趣味の開発・開発用記事一覧を自動収集して時系列で表示

最近はサーバーやプログラム調査が多く、プログラムを書くことが少なくなっていました。そこで、休みなどで何か作ろうと思ってい、前から考えていた複数のサイトの開発用記事一覧を自動収集して時系列で表示するものを作ってみました。
IT News 一覧

基本は、RSSで記事一覧を取ってきて、データベースに保存し、ある条件で並べて表示となっています。

開発はPHPで、フレームワークは使わずに一から作ってみました。CakePHPやSymfonyなど、フレームワークを使ってもよいのですが、フレームワークは仕事で使うので、勉強の意味も兼ねてフルスクラッチにしてみました。

今回作成したページは、通勤時スマホ、自分の部屋ではPCから見るので、その両方に対応させました。デザインセンスが無いので見た目ががよくありませんが、とりあえず自分が見る分には問題ないので、いろいろな実験も兼ねてこのまま運用していきたいと思います。
posted by jun1 at 00:07| Comment(0) | TrackBack(0) | Web

2014年11月07日

PHP:var_dumpとprint_rについて

現在の業務では、PHPを使う機会が減っています。個人的に、PHPでプログラムを作ったりする場合があるのですが、PHPの細かい点を少し忘れ気味です。

最近、デバッグで配列やオブジェクトの中身を確認するのに、var_dumpばかり使っていることに気がつきました。似た関数にprint_rがあります。何らかの理由でprint_rよりvar_dumpを使うようにしたのですが、その理由を思い出せません。また、両方の違いも忘れ気味なので、var_dumpとprint_rについて簡単な確認用のまとめページを作ってみました。
PHP・デバッグ・変数の中身確認

var_dumpの結果を変数に代入する方法のような、使う機会がほとんどないテクニックも、とりあえず忘れないように記録しておきます。
posted by jun1 at 07:33| Comment(0) | TrackBack(0) | ソフト

2014年10月26日

MySQL:IPアドレスを保存するカラムのデータ型

MySQLにクライアントのIPv4アドレスを保存する必要ができました。そこでテーブルを作ることになりましたが、IPアドレス用カラムはどのデータ型が良いか疑問に思ったので調べてみました。

今までの仕事で何度か稼働中のMySQLを使うことはありましたが、ほとんどの場合、IPアドレスはVARCHAR型で保存していました。(他の人の設計)

VARCHAR型でも問題ありませんでしたが、今回はPostgreSQLに専用のデータ型があることを思い出してしまいました。そのため、MySQLにも無いのかな?と疑問に思い、調べてみることにしました。

例 PostgreSQLのIPアドレス用のデータ型
ネットワークアドレス型 (PostgreSQL 9.3.2文書)

調べた結果、MySQLは文字列以外だとUNSIGNED INTEGERか、VARBINARY(4)で、INET_ATON()やINET_NTOA()関数と一緒に使うのが良さそうでした。
INET_ATON() (MySQL 5.6 Reference Manual)

IPv6の場合は、データ型にVARCHAR(16)を指定して、INET6_ATON()とINET6_NTOA()関数を使うようです。ただし、INET6_ATON()とINET6_NTOA()はMySQL 5.6.3から追加されました。そのため、5.6.3以前のバージョンでは使用できないそうです。試しに5.1でINET6_ATON()を使うとエラーになりました。
mysql> SELECT INET6_ATON('::1');
ERROR 1305 (42000): FUNCTION test.INET6_ATON does not exist

参考
IPv6 and internationalized domain (IDNA) functions for MySQL
Changes in MySQL 5.6.3 (2011-10-03, Milestone 6)

これらの結果は以下にまとめました。
MySQL IPアドレス用カラム

追記
MySQLへのIPv4アドレス保存を、PHPで試してみました。また、PHPにもIPv4アドレスの文字列、整数変換用の関数ip2long()、long2ip()がありますので、合わせてテストしてみました。
ip2long、long2ipのテスト
posted by jun1 at 14:21| Comment(0) | TrackBack(0) | データベース

2014年10月13日

Google DNSが。。。

今日8時ごろ、急にネットが繋がらなくなりました。Firefoxの下側に表示されるメッセージを見ていると、名前解決で待ち状態になっているので、Windowsのコマンドプロンプトからnslookupで確認すると、名前解決で応答が無いような状態でした。

そこで、nslookup の参照DNSサーバーを、Google DNSに変更してみました。
以下のように確認しましたが、応答が帰ってきません。
> nslookup yahoo.co.jp 8.8.8.8

何かDNS関係でトラぶっているようなので、ネットはあきらめて晩飯にすることにしました。晩飯を食べ終わったあと、ネットを確認すると、いつのまにか正常になっていました。

何が起こったのか調べると、原因はGoogle DNSだったようです。。。
【注意】google DNSが死亡 ネットに繋がらないなど障害が発生中 10月13日(NAVERまとめ)

あれ?

ルーターのDNSサーバーはプロバイダーから取得するように設定してたはずじゃなかったかな?と思いましたが、よくよく思い出すとルーターの設定を変更していました。

以前、プロバイダのDNSサーバーがトラぶったことがあり、そのときにルーターのDNSサーバーをGoogle DNSの8.8.8.8に変更したままでした。。。

とりあえず、また同じ間違いを犯さないように、ルーターのDNSサーバーの設定変更と、Google DNS以外のPublic DNSを調べました。

Google DNS以外のPublic DNSを調べると、もっと速いのがあるようです。
「8.8.8.8,8.8.4.4」より速い「129.250.35.250」

とりあえず、以下をメモしておきます。
・129.250.35.250
・129.250.35.251