サイトで公開していたpdfファイルに変更が入って置き換える際に、ファイル名を変更することがよくあります。
そのようなケースは古いpdfファイルにアクセスが来た時に最新のpdfファイルにリダイレクトする必要があります。
よくある書き方は、こうです。
RewriteRule ^/wp-content/uploads/oldfile.pdf /wp-content/uploads/newfile.pdf [R=301,L]
1度や2度ならば愚直に.htaccessに書いてもいいのですが、さすがに何度も改版が続くとこの書き方だと、修正量が多いなと疑問になりました。
RewriteRule ^/wp-content/uploads/oldfile1.pdf /wp-content/uploads/newfile.pdf [R=301,L] RewriteRule ^/wp-content/uploads/oldfile2.pdf /wp-content/uploads/newfile.pdf [R=301,L] RewriteRule ^/wp-content/uploads/oldfile3.pdf /wp-content/uploads/newfile.pdf [R=301,L] RewriteRule ^/wp-content/uploads/oldfile4.pdf /wp-content/uploads/newfile.pdf [R=301,L]
というのも、newfile.pdfの名前は毎回変わるので過去に書いた部分を書き換える必要があります。
RewriteCondを使ってスマートに解決したい
改版があるたびにnewfile.pdfが書かれている行が増えていくので保守するのが大変な理由です。
mod_rewriteを使うなら、RewirteCondを使ってスマートに解決できるはずです。
newfile.pdfが1回だけしか出てこないようにRewriteCondを使って条件判定しつつ、最後にRewirteRuleを使います。
次のように書いて、RewriteCondをOR条件でつなげていけばうまく動きます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^?/wp-content/uploads/oldfile1.pdf [OR]
RewriteCond %{REQUEST_URI} ^?/wp-content/uploads/oldfile2.pdf [OR]
RewriteCond %{REQUEST_URI} ^?/wp-content/uploads/oldfile3.pdf [OR]
RewriteCond %{REQUEST_URI} ^?/wp-content/uploads/oldfile4.pdf [OR]
RewriteCond %{REQUEST_URI} ^?/wp-content/uploads/oldfile5.pdf
RewriteRule ^(.*)$ /wp-content/uploads/newfile.pdf [R=301,L]
</IfModule>
RewriteCondをORでつなぐときは最後の行に[OR]をつけるとリダイレクトループになってしまうので注意します。
リダイレクトの動作を確認できるサイト
リダイレクトはデバッグするのが大変なので、リダイレクトループになると嫌になりますが、リダイレクトの動作確認に便利なサイトがあります。
まとめ
検索してコピペだけしていると、リダイレクトループが発生した時に解決できないだけでなく、効率の悪い書き方をしていることにも気が付きにくくなるなと思いました。