エロサイトの作り方

2013年11月から勉強しながらエロサイトを作っています。

Nginx(Proxy Cache) + WordPressの構成でアーカイブ系ページで戻るとバックエンドのurlが表示される件

条件が複雑なせいか検索しても情報が無くて途方に暮れましたが、根本解決じゃないですが一応回避できたので。

前提条件

  • Nginxでリバースプロキシーを使ってる
  • proxy_cache_keyでデバイス判定をしている
  • バックエンド側でPHP-FPM経由でWordPressを使っている

問題

WordPressのアーカイブ系ページ(日付、カテゴリー、タグなど)でアーカイブトップページが表示されない。

具体的には、

  • /archives/{type} - 表示できる
  • /archives/{type}/ - バックエンドに飛ぶ
  • /archives/{type}/page/2 - 表示できる

というように、最後に/が付くと表示できない。

http://hentai-kun.example.com/archives/tag/oppai/

にアクセスした場合、

http://backend/archives/tag/oppai/

というようにバックエンドへ飛ばされて404になる。

バックエンドは内部表記なのに露出してきて困る。

原因

色んな箇所をコメント化しながら探ったところ、

set $device 'pc';
if ($http_user_agent ~* '(Android|(blackberry|\bBB10\b|rim tablet os)|(PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino)|(Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b)|(Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;)|(Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7)|(\biPhone.*Mobile|\biPod|\biPad)|MeeGo|Maemo|(J2ME/|\bMIDP\b|\bCLDC\b)|(webOS|hpwOS)|\bBada\b|BREW)') {
  set $device 'phone';
}
if ($http_user_agent ~* '(iPad|Android((?!Mobile).)+$|Windows NT [0-9.]+; ARM;)') {
  set $device "tablet";
}
proxy_set_header X-UA-Detect $device;

このデバイス判定を元に、

location / {
    ...
    proxy_cache_key    "$scheme://$host$request_uri@$device";
}

proxy_cache_keyを設定するとバックエンドに飛ばされる。

この設定を、

    proxy_cache_key    "$scheme://$host$request_uri";

こうすれば正常に処理できる。ただし、当然WordPress側でデバイスごとにレンダリングを分けることができなくなる。

解決方法(根本)

先のURLを例に出すと、

http://hentai-kun.example.com/archives/tag/oppai/

-> http://hentai-kun.example.com/archives/tag/oppai/@pc

のような展開がされて@pcというファイルがあるように解釈されるのかなぁと思って、

    proxy_cache_key    "$scheme://$host$request_uri?@$device";

のようにリクエストパラメータにしても解決しなかった。

ここで手詰まり。

解決方法(暫定)

とりあえず、リダイレクトさせるというトホホな方法で回避させました。

rewrite ^(/archives/.+?)/$ $1 permanent;

Nginxの本とか買えば詳しく書いてあるんですかねぇ。

マスタリングNginx

マスタリングNginx