※この記事は11年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。
さて、仕事の合間だけど、備忘録として。
今回は、WEBやるうえでは、一つ課題になる、リダイレクトに関してだ。
たとえばサイトを休止したい時、
サーバー内のファイルを残したまま、ページを隠したい、
なんて要望に応えるには、リダイレクトで全てのページへのアクセスを、
休止用HTMLにリダイレクトするのが一番いい。
方法は大きく分けて二つ。
- 各ページにリダイレクトのmetaタグを入れる
- .htaccessを使う
metaの書き方は下記
<meta http-equiv="refresh" content="秒数;URL=URL">
しかし、今回のようにページ全てとなると、これはめんどい。
というわけで、.htaccess
を使う方法。これしかない。
なんてキーワードでググれば、
だいたいは下記記述にあたるだろう。
RewriteEngine on RewriteCond %{REQUEST_URI} !^/index.html$ RewriteRule ^(.*)$ /index.html [L,R]
解説すると、RewriteCond %{REQUEST_URI} !^/index.html$
で、
トップページは除外しますよ、と指定。
RewriteRule ^(.*)$ /index.html [L,R]
で
全部のファイルを、トップへという指定だ。
しかし、これが、とにかくできない・・・!
どんなにやっても、できない!
リダイレクトループも発生して、
お手上げ!
いろいろ書き方試して、リダイレクトできるようになっても、
たとえば/about/index.html
でアクセスすると、
画像とかCSSが効いてないページが表示される。
(※この時、/about/
では上手くいった)
そう、この記述、一行足りないのだ。
下記記述であれば、完璧である。
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !^/index.html$ RewriteRule ^(.*)$ /index.html [L,R]
このRewriteBase /
これが大事。
意味は、ベースのパスはここですよ!って意味。
/
だけを書けば、ルートをベースに指定できる。
つまり、上の方の書き方だと、
「index.html
だったらなんでも除外するよ!」
ってことになる。
たとえば、/about/index.html
も除外するため、
/about/index.html
にアクセスした時はリダイレクトされない。
パスを/
から始めている意味がなくなっているのだ。
(パスを指定する時、/
から始めると、サーバードキュメントのルートからのパスになる。)
よって、ベースをルートに指定してやればいいのだ。
そうすれば、/
からパスを始めると、ルートをからに指定できるのだ。
下の書き方ならば、
「ルート階層にあるindex.html
だけ除外するよ!」
とできるわけ。
ちなみに、ググった時に、
RewriteBase /
をしっかり記述している記事は、
ほとんどない(怒)
それくらい.htaccess
の常識ってこと・・・?
コメントする