mod_rewrite 複数のパラメーターを書き換え

Apache

mod_rewrite 複数のパラメーターを書き換え

Apache .htaccess でURLを書き換えで書いたように、.htaccessにmod_rewriteの指定を書くことで、動的なURLも静的なURLに見せかけることができます。

複数のパラメーターがある時はどうでしょう。

たとえば

 http://hogehoge.jp/index.php?action=search&prefecture=1

というURLを

 http://hogehoge.jp/search?prefecture=1

としたいのであれば、Apache .htaccess でURLを書き換えで書いた.htaccessの書き換えルールの末尾を変えて

 RewriteRule  ^([0-9a-zA-Z_/-]+)$ index.php?action=$1 [QSA,PT] 

とします。

[QSA]は、「Query String Append」の略で、引数をつけたいときに使うフラグだそうです。
(By http://d.hatena.ne.jp/hato_mune/20080928/1222569429

でもどうせだったら

 http://hogehoge.jp/search?prefecture=1

じゃなくって、全部静的にしたいじゃないですか。

 http://hogehoge.jp/search/prefecture/1

みたいに。

そのためには.htaccessに

 RewriteRule  ^([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)$ index.php?action=$1&$2=$3 [QSA,PT] 

と書いておきます。

これで、ユーザーがアクセスする静的なURL

 http://hogehoge.jp/search/prefecture/1

は実際には

 http://hogehoge.jp/index.php?action=search&prefecture=1

にアクセスしていることになります。

パラメーターが増える場合は、rewrite ruleの正規表現とパラメーターを増やして

 RewriteRule  ^([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)$ index.php?action=$1/$2&$3=$4 [QSA,PT] 

などとします。

mod_rewrite難しい~
もっとスマートなやり方があれば、教えてください。

mod_rewrite クエリーストリングの値に基づいてリダイレクトする

Apache

mod_rewriteのRewriteRuleではクエリーストリングの内容を条件にしたルールを記述することはできません。クエリーストリングの内容を条件にしたい場合は、RewriteCond %{QUERY_STRING}を使います。

以下は、クエリーストリングがparam=sslで始まる場合にHTTPSにリダイレクトする例です。

 RewriteEngine On
 
 RewriteCond %{SERVER_PORT} ^443$
 RewriteCond %{QUERY_STRING} ^param=ssl
 
 RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R]

mod_pagespeedをインストールする

Linuxサーバー

2013/8/27時点の情報です。
mod_pagespeedを導入すると、クライアント側のレンダリング速度は改善されますが、サーバー側のCPU負荷・メモリ消費・Disk I/Oは増加し、純粋なスループットは低下します。
Disk I/O負荷を軽減するため、キャッシュ領域にtmpfsを割り当てたり、memcachedを利用することが可能です。

インストール

下記ページからサーバーにあったパッケージを取得します。
https://developers.google.com/speed/pagespeed/module/download

CentOS 65bitの場合は下記の手順になります。

 wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm
 yum install at
 rpm -U mod-pagespeed-*.rpm

デフォルトでmod_pagespeedが有効で、css/javascript/画像の最適化が
有効な状態になっています。

Webサーバーを再起動すると、mod_pagespeedが有効になります。

設定ファイルの場所

apacheの場合は下記になります。

 /etc/httpd/conf.d/pagespeed.conf

mod_pagespeedの有効・無効切り替え

pagespeed.confで有効・無効を切り替えることができます。
インストール時デフォルトで有効になっています。

有効にする

 ModPagespeed on

無効にする

 ModPagespeed off

統計データ表示

下記URLで統計データを閲覧できます。
http://server-name/mod_pagespeed_statistics

デフォルトではローカルホストしか閲覧許可していないので、必要に応じてpagespeed.confを修正します。

 <Location /mod_pagespeed_statistics>
     Order allow,deny
     Allow from localhost
     Allow from 127.0.0.1
     SetHandler mod_pagespeed_statistics
 </Location>

処理メッセージ表示

下記URLで処理メッセージを閲覧できます。
http://server-name/mod_pagespeed_statistics

デフォルトではローカルホストしか閲覧許可していないので、必要に応じてpagespeed.confを修正します。

 <Location /mod_pagespeed_message>
     Allow from localhost
     Allow from 127.0.0.1
     SetHandler mod_pagespeed_message
 </Location>

キャッシュをクリアする

cssファイル等を変更すると、キャッシュをクリアしないと表示が崩れる場合があります。
下記コマンドでキャッシュをクリアします。

 touch /var/cache/mod_pagespeed/cache.flush

古いキャッシュは、新しいキャッシュで上書きされるようになります。

  • 2013/9/17 キャッシュクリアのファイルパスを訂正しました。

mb_send_mail()でSMTP server response 451のエラーが出る

PHP

PHPでメール送信のプログラムを作っていて、テスト用にあるレンタルサーバーでメール送信をしようとしたところ、

Warning: mb_send_mail() [function.mb-send-mail]: SMTP server response: 451 See http://pobox.com/~djb/docs/smtplf.html.

というエラーメッセージが出てきて、送信ができなかった。

参照元になっている、下記のサイトを見ると
http://cr.yp.to/docs/smtplf.html

メールサーバーがQmailを使用していて、プラス改行とかに原因があるらしい。
裸のLFがダメ(直訳すぎ?)で、CR LFならOKってことだそうで。

いろいろやってみて、メール本文中の \n を削除したらエラーがでなくなりました。
\nはLFだからなんですね。

mavenでインストールしたプログラムを実行する

Java

mvn installしただけでは、依存関係が解決できずにプログラムを実行できない場合は、下記のようにするとdependancyディレクトリに全て依存ライブラリもインストールされて実行できるようになります。

 mvn clean install dependency:copy-dependencies
 java -classpath ".:*:dependency/*"  "クラス名"