さて、仕事の合間だけど、備忘録として。
今回は、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の常識ってこと・・・?
コメントする