Nginx(Proxy Cache) + WordPressの構成でアーカイブ系ページで戻るとバックエンドのurlが表示される件
条件が複雑なせいか検索しても情報が無くて途方に暮れましたが、根本解決じゃないですが一応回避できたので。
前提条件
問題
WordPressのアーカイブ系ページ(日付、カテゴリー、タグなど)でアーカイブトップページが表示されない。
具体的には、
/archives/{type}
- 表示できる/archives/{type}/
- バックエンドに飛ぶ/archives/{type}/page/2
- 表示できる
というように、最後に/
が付くと表示できない。
にアクセスした場合、
というようにバックエンドへ飛ばされて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を例に出すと、
のような展開がされて@pc
というファイルがあるように解釈されるのかなぁと思って、
proxy_cache_key "$scheme://$host$request_uri?@$device";
のようにリクエストパラメータにしても解決しなかった。
ここで手詰まり。
解決方法(暫定)
とりあえず、リダイレクトさせるというトホホな方法で回避させました。
rewrite ^(/archives/.+?)/$ $1 permanent;
Nginxの本とか買えば詳しく書いてあるんですかねぇ。
- 作者: Dimitri Aivaliotis,高橋基信
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/10/26
- メディア: 大型本
- この商品を含むブログ (5件) を見る