Map Moduleを使用したリダイレクト方法

IMG_1920
少し前に、200ページものURLをリダイレクトさせた時に、Nginxに元々入っているMap Moduleを使用したけど、日本語の説明がすごく少なかったので、メモ

Map Moduleを使ってリダイレクトさせるにはconfigファイルに以下のように書く

map "example" $url {

“example” “example2”

}

この場合だとexampleという文字にマッチした場合は$urlという変数にexample2という値がはいることになります。 ちなみにマッチしない場合は$urlには値がはいりません。

つまり条件判定で以下のようにかければ、マッチしているかどうかがわかります。
if ($url) {

# 一致した場合の記述

}
なので、サンプル
map $request_uri $url {

~^/2015/04/01/.* http://example.com/2015/04/01/art/;

}
server {

listen 80;

server_name example.com;
if ($new) {

rewrite ^ $url permanent;

}
}

でも、これだとconfigファイルに200ページ書かなきゃいけないし、後でconfigファイル見たら「なにこれ???」となるので、mapファイル作ってそれをincludeします。


sudo vi /etc/nginx/conf.d/default.conf

map $request_uri $url {

include /etc/nginx/redirect_list.map;

}
server {

listen 80 default ;
server_name example.com;
root /var/www/vhosts/example;
index index.html index.htm;
charset utf-8;

if ($url) {

rewrite ^ $url permanent;

}
}

/etc/nginx/redirect_list.mapには以下の様に記述します。

~^/2015/04/01/.* http://example.com/2015/04/01/art/;
~^/2015/12/31/.* http://example.com/2015/12/31/demo/;

でも、これだと末尾に」「/」がないとリダイレクトしないので、「/」がなくても一致したと判断しリダイレクトさせる為に正規表現を使用します。

~^/news1377[/]?$ https://example.com/news/news1377;

しか〜し!
大量にリダイレクトをかけると以下のようなエラーが出る。

[ec2-user@ip-111-22-33 ~]$ sudo /etc/init.d/nginx restart
nginx: [emerg] could not build the map_hash, you should increase map_hash_bucket_size: 64
nginx: configuration file /etc/nginx/nginx.conf test failed

map_hash_bucket_sizeが足りないとの事なのでサイズを変更。
map_hash_bucket_sizeは64、128、256があります。Nginxのconfigファイルを変更して、Nginxを再起動したらOK!

sudo vi /etc/nginx/nginx.conf

user nginx nginx;
worker_processes 2;
worker_rlimit_nofile 10240;
http {
include /etc/nginx/mime.types;

default_type application/octet-stream;
client_max_body_size 20M;

client_body_buffer_size 256k;
map_hash_bucket_size 128;
if_modified_since before;
sudo /etc/init.d/nginx restart

又、同じページ名を使用して2重リダイレクトなんてハプニングもある!
例えば、

①元:display-one 新:display にリダイレクト
②元:display 新:display-new にリダイレクト

この場合①と②は違うページです。
これだと、①でリダイレクトしたURLが②の元のURLと同じなので、元:display-oneは 新:display-newにリダイレクトされちゃうって訳です。
まぁ、当然なんですが・・・・
でも、要望であればしないといけ無いので・・・・

location = /display-one/ {
rewrite ^/display-one[/]?$ https://example.com/display permanent;
break;
}

と言うふうに最後にbreakを指定すると、rewriteを終了します。
逆にbreakし無ければループします。
この記述はmapファイルでなく、default.confに記述してくださいね。

と言う事で無事に200ページほどリダイレクトできました!
そして、また!現在、これをApacheでやっている最中です。
今度も、150ページほどリダイレクト(涙)

外部認証でWordPressにログイン

これをやる時にやり方を調べても全然出てきませんでした。
(-_-;)ホントカ・・・オイとなったので(o^-^)φメモ

普通はWordPressにユーザーを作成し、そのユーザでログインしますが、以前、会員サイトを構築した時に以下の仕様を作りました。

「外部のDBに会員情報を置きそのDBにAPIで接続、そして、外部で認証後、データ取得しWordPressにログイン」

まずは、仕様を詳しいく説明。

外部のAPIにログイン情報を渡してそこで認証させログイン情報があっていれば会員情報を渡してくれる間違ってたら「違うよ〜」と言われる。そして、ログイン情報が正しくて会員情報が帰ってきたら、ここでWordPressにログイン!

とまぁ、こんな感じで開発。
なのでログインにはWordPressの関数は使えない。
PHPでフツーにログイン処理

次にAPIにログイン情報を渡す処理

やっとここからWordPress側に!
ログイン処理は普通にPHPでごにょごにょ書いてあるので、それを使ってログイン!


if( isset($_POST['loginid'])){
if ($login_member->login_validation($_POST) === false) {
$message = 'ログインに失敗しました';
}elseif(Login_member::login($_POST) === false){
$message = 'ログインに失敗しました';
}else{
$url = site_url('member');
header("Location: {$url}");
exit;
}
}

とログインまで完成!と思いきや、なんか動作がおかしい(´・ ・`)?

なんかログアウトしてまたログインしようとしたらログインしてないのにすでにログイン済みになってるんですけど。
しかも、違うユーザーでログインしても前回のユーザー名が出てるし(;^_^A

キャッシュが残ってる?(ーー;)
しかも高速化考えてNginxにしてるのでめちゃくちゃキャッシュ残ります。
だからNginx側でログインしたらキャッシュ取らないように設定すればいいのです。
じゃぁWordPressコアファイルがどうしてる?と思ったので調べました。

コアファイルはログインしたらCookieにを保存してるんです。
いつもお世話になっているこの本「WordPressプラグイン開発のバイブル」を書かれたあの方のサイトにも書いてある。(あざっす!)
WordPressのCookieのナゾ
なのでこれをそっくりそのままやりました。

wordpress_logged_in_xxxx
私の場合はログインを自作しているのでこっち側だけでOK!(本当か?)

そしてNginx側で設定(※他のクッキーと一緒に設定してます)

# コメント書き込み中、ログイン中、パスワード保護コンテンツはキャッシュしない
if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
set $do_not_cache 1;
}

そして、Nginxの設定を変えたら再起動もしくは再読み込み

/etc/init.d/nginx restart
もしくは
/etc/init.d/nginx reload

これで完了!

コアファイルよく考えてある。素晴らしい!

PHP アップデート後にエラーになる

先日、ec2にsshで接続したら
「アップデートあるよ〜」
と出たので、調子にのってアップデートしたらWarningが出て怒られた(;^_^A
忘れるのでφ(゚▽゚*)メモメモ(*゚▽゚)ノ□ペタッ

ErrorMessage

Warning: Unknown(): open(/var/lib/php/session/sess_XXXXXXXX, O_RDWR) failed: Permission denied (13)

対処

PHPのセッションを書きこむ/var/lib/php/session/の権限が、root.apacheになっているので、nginxへ変更。

コマンド

sudo chown -R root.nginx /var/lib/php/session/

上記でなんとかなりました(*´∀`)ノ
アップデートしたら権限戻ちゃうの?