それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Apache2でmod_rewrite が動かない?

Apache2 で rewrite エンジンを動か無いときにチェックするもの

久しぶりに、ubuntu にApache2+php いれて /aaa/aaa を /index.php/aaa/aaa に転送しようとしたら出来ない。

apache2 の場合、rewrite を使うまでにいくつか手順が必要

  1. rewrite が有効になっていますか
  2. Allow Override が使えるか
  3. htaccess の記述内容は正しいですか

rewrite を有効にして、有効になっているか。

apache の場合、rewrite を使ってリクエストのPATHをキャッチオールするので、有効にする

sudo a2enmod rewrite 
sudo apache2 configtest
sudo apache2 restart

Allow Override

apache2.conf で Allow Orverride を有効にする

Allow Orverride はディレクトリに対する設定で書くので、apache2.conf に書く。

 <Directory /var/www/>
   Options Indexes FollowSymLinks
   AllowOverride All
   Require all granted
 </Directory>

.htaccess の記述

.htaccess の記述を確認する。rewrite を有効にしているかチェック

<IfModule mod_rewrite.c>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpe?g|css|ico|js|svg|map)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

rewrite を使う時

rewrite は標準でインストールされるが、htaccess で使うのに Allow Override がhttpd.confに必要で、一回書くとずっと使うので忘れますね。

nginx だと rewrite のルールは nginx のconfig に書くので、更に忘れますね。

参考資料

Apache/Apacheでmod-rewriteが動かない場合の原因のいくつか - Web関連技術調査

シェル ( /bin/sh ) での正規表現マッチ。

以前、bash正規表現について書いた。

今回は、今更だけど、あえて、bash/zsh で使われている [[ を使わずに、正規表現を使おうとしてみた。

expr よりは bash の機能を使ったほうがいい。

以前書いた記事にある。bash/zsh正規表現を使う方法が個人的には優れていると思う。

takuya-1st.hatenablog.jp

どうしても sh じゃないとだめなんだったときは expr を使う選択肢になる。

/bin/sh の場合は expr で正規表現を扱う。

シェルの正規表現は、次のようにかける。

expr "なにか文字列" : "regex"

または、次のように書く。

expr match "なにか文字列"  "regex"

expr は expression の略だったかとおもう。Expressionの名前の通り、文字列表現の式を評価をする。四則演算なども使います。

expr を使う上での注意。

expr は式を評価するので、結果がプリントされます。

通常の [ / test は結果をプリントせずにステータース・コードをexit code で返しますが、expr は文字列を出力するので注意。

expr で正規表現

正規表現をするときは次のように書きます。

expr hello :  'h.*o' 

または

expr match hello   'h.*o' 

if 文 と expr でマッチングで条件分岐

expr を正規表現マッチで返すと一致したかどうかを文字列でプリントするので、出力を捨てる必要がある。

if expr hello :  'hello' > /dev/null ; then
  echo match
fi

サンプル

正規表現/bin/sh で動くように regex をexpr で扱ってbashだけでなく汎ゆる場所で動くことを想定したらこんな感じになるが

#!/bin/sh


match_test () {
  printf "%-18s:" "$1"
  if expr "$1" : '.*apple' > /dev/null ; then
   echo match
  else
    echo does not match
  fi

}

match_test "Hello World."
match_test "This is an apple."
match_test "This is a pen."

実行結果

上記の実行結果

$ ./test.sh
Hello World.      :does not match
This is an apple. :match
This is a pen.    :does not match

細かい部分で [[ と違う。

正規表現の柔軟度を考えると、bash / zsh に組み込まれている [[ を使ったほうが正規表現の書きやすさ、マッチ判断のわかりやすさが上回っている。

関連資料

bashでif に正規表現を使った文字列マッチ条件分岐 - それマグで!

Vimのet / noet って何?→expandtab です。

vimrc の設定ファイルでet を見かける

et ってなんだよ!ってことを感じたのでメモ。

set et  " set expandtab と同等
set noet  " = set noexpandtab 

noetno + et ですね。

vimrcなどvim の設定ファイル は noXXX で表記されることが多いですね。set nonumber 略して set nonuなど。

expandtabetなので、noexpandtabnoet ですね

expandtab ってなに

タブ文字入力をスペースとして扱うやつです。どのサイズになるのかは ts=2 ( tabstop=2 ) などで調整します。

expandtab(et / noet ) を設定するときは併せて ts / sw を調整しましょう

参考資料

:set expandtab(:set et)設定の時に、タブ文字を挿入する — 名無しのvim使い

Vim のカスタマイズ 〜 タブ/インデントの設定 〜 - Vim のブログ