スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近のツッコミ:
  1. p (07/15)
最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|
2018|05|07|
2019|07|

2011/03/21

_ [Web制作][システム運用] wget で取得した QUERY_STRING 付きページをオリジナルと同じ URI で表示させるには

wget --mirror で Web サイトをまとめて取得すると、QUERY_STRING がついている URI は ? が @ に置き換えられた形で保存される。

これを無理矢理元のサイトと同様に表示させたかったらどうすれば良いか。

mod_rewrite 使って URL 中の ? を内部で @ に書き換えて実ファイルにつなげてやればいいんでないの、と単純に考えると、

RewriteEngine on
RewriteRule (.*)\?(.*) $1@$2

…となるわけだが、実際にはこれではうまくいかない。

原因は RewriteRule に QUERY_STRING は渡らないため。

ならば、こうすれば良い。

RewriteEngine on
RewriteCond %{QUERY_STRING} (.+)
RewriteRule (.*) $1@%1?

RewriteCond で QUERY_STRING を先行してマッチさせておき、RewriteRule で後方参照して付け足す。

また、最後の ? によって QUERY_STRING を削除する。(これをやらないと書き換えが無限ループしてしまう)

なお、拡張子が激しく壊れるために適切な Content-Type が返されなくなり、IE 以外のブラウザでは HTML として解釈されずソースを表示してしまう場合があるので、

DefaultType text/html

も加えておいた方がよい。

…ということで、3月中に引き上げなければならなくなった (けどサーバ側プログラムの移行先がない) 動的生成ページが多数ある某サイトを無理矢理待避するやっつけ仕事が終わった。