シンプルに行けば、こうでしょうか。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.html$ #この行を追加
RewriteRule ^([^/]+)/?$ $1.html [L]
4行目にRewriteCond %{REQUEST_FILENAME} !\.html$
を追加しています。
これによって、
「リクエストされたファイルやディレクトリが無く、かつファイルの末尾が .htmlでない」
場合に、末尾に.html
を追加する処理を行います。
この行が必要な理由としては、apache serverでは
.htaccess
で書き換えが行われた場合、再度パスの解決を試みる為です。
つまり、書き換えが発生しなくなるまで、.htaccess
に書かれているRewrite
を
最初からやり直し続ける、ということになります。
提示されましたコードですと、存在しないファイルにアクセスした場合.html
を末尾につけますので、
/example
にアクセスしたとすると
「example
が存在しないので.html
を末尾につける」
↓
「パスがexample
からexample.html
に変更されたため、Rewrite
を最初からやり直す」
↓
「example.html
が存在しないので.html
を末尾につける」
↓
「パスがexample.html
からexample.html.html
に変更されたため、Rewrite
を最初からやり直す」
↓
…
と無限ループになり、サーバーはそれを検知し500を返却します。
これを回避するためには、末尾が.html
である場合(既に書き換えがされている場合)には
末尾に.html
をつけることをスキップするように指定すれば良いです。
その為、4行目にRewriteCond %{REQUEST_FILENAME} !\.html$
を追加して、
既に.html
が末尾についているパスについては処理させないようにしている、と言う事になります。
このあたりは、(自分の記事で恐縮ですが)
.htaccess に RewriteRule 書くときは、[L]フラグをつけてもそこで終了しないかもよ?って話。
でまとめていますので、興味があればご覧下さい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。