.htaccess でサブディレクトリの中で特定条件(特定ディレクトリ配下と特定ページと各種リソース)とトップページ以外をトップページに302リダイレクトさせる

ややこしい条件ですが、タイトルのことをしたくなったので書きました。

条件は以下。

  • あるサイトのサブディレクトリ (https://example.com/hoge/) の配下
  • トップページ以外はトップページにリダイレクト。ただし以下条件を除く。
    1. 特定ディレクトリ配下 (https://example.com/hoge/fuga/)
    2. エラーページ (ここでは全て errorXXX.html のようなURLになっているものとします)
    3. 各種リソースファイル (拡張子が css, js, jpg, gif, png, svg, ico, xml, otf, ttf, woff, woff2)
  • 302 リダイレクトさせる
RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (MSIE|Trident) [NC]
RewriteCond %{REQUEST_URI} !(^/hoge/error-ie.html$)
RewriteRule ^(.*)$ /hoge/error-ie.html [R,L]

RewriteCond %{REQUEST_URI} !(^/hoge/(index\.html)?$)
RewriteCond %{REQUEST_URI} !(^/hoge/fuga/)
RewriteCond %{REQUEST_URI} !(^/hoge/error(.*)\.html)
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|gif|png|svg|ico|xml|otf|ttf|woff|woff2)$
RewriteRule ^(.*)$ http://example.com/hoge/ [R=302,L]

ErrorDocument 404 /hoge/error404.html
ErrorDocument 500 /hoge/error500.html

こんな感じで対処。

しかし .htaccessでサブディレクトリ内のURLをリダイレクト とか `.htaccess` で全アクセスをリダイレクトする とか、わりとこの手のを頻繁にやっている気がしますね……おおよそパターンも掴めているので、ジェネレータとか作った方が良いのかもしれない。

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。