.htaccessの設定まとめ

2017.6.25

.htaccess とは何か

apache の設定ファイルの一部。

ディレクトリごとに設定を行いたいときに、htaccess ファイルを使用すると実現できる。

ただし、htaccess が使えるかどうかは、レンタルサーバによって、違いがあるので、要確認。

※htaccess という名前も、Apache の設定で変更できる。デフォルトで、htaccess となっている模様。

301 リダイレクト

RewriteEngine on
RewriteBase /
RewriteRule example.html "http://www.example.jp/.html" [R=301,L]

302 リダイレクト

301 リダイレクトと 302 リダイレクトの使い分け

301⇒ 恒久的なリダイレクトの時。

302⇒ 暫定的なリダイレクトの時。

404 リダイレクト

存在しない URL にアクセスされたとき、404 ページにリダイレクト。

事前に 404 エラーが発生した時に表示したいページを作成しておき、htaccess でステータス 404 のとき、指定の URL にリダイレクトする。

ErrorDocument 404 /404.html

この例では、404 エラーが発生した時に、404.html ページへリダイレクトされることになる。

mod_rewrite を有効にして URL の書き換えが出来るようにする

htaccess で mod_rewrite を有効にするため、.htaccessファイルの先頭に下記のコードを書いておく。

RewriteEngine On

これを書いておくことで、rewrite コマンドを使用することができる。

リンク切れ画像を別の画像に差し替えて表示する

サイトに張った画像へのリンクがいつの間にか切れている。

とか、後から特定のファイル名で画像を置くけど、今は画像が無いとか。

そういった場合、画像が存在しないため、画像がうまく表示される、画面のデザインが崩れてしまう。

この方法を使えば、画像が無いときにあらかじめ用意した「noimage.jpg」を代わりに表示して、デザインの崩れを防ぐことができる。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} (.*)/img/(.*)\.jpg
RewriteRule ^.*$ /noimage.jpg [L]

各行を説明していく。

RewriteCond %{REQUEST_FILENAME} !-f

ファイルが存在しなかったとき。を表現している。

RewriteCond %{REQUEST_FILENAME} (.*)/img/(.*)\.jpg

このパターンにマッチする画像がなかったときに、後述の代替画像を表示する。

RewriteRule ^.*$ /noimage.jpg [L]

ファイルが存在しなかったとき、代わりに表示する画像を記述。

mod_rewrite を使って画像ファイルへの直リンクを禁止する

サイトに限らず、画像や PDF などのファイルは勝手にリンクを貼られることがある。

htaccess の設定を行うことで簡単に防止することができる。

RewriteBase /img/
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?note\.mokuzine\.net [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !bing\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{REQUEST_URI} !^dummy\.jpg$
RewriteRule \.(jpe?g|png|gif)$ dummy.jpg [NC,R,L]

各行を説明していく。

RewriteBase /img/

URL の書き換えを行うアクセス対象のディレクトリ。

このディレクトリ下に置いているファイルにアクセスしたときに、設定が実行される。

RewriteCond %{HTTP_REFERER} !^$

リファラーが無いときに許可する。

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?note\.mokuzine\.net [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !bing\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]

アクセスを許可する、参照先を記載。

ここに書いているサイトからのアクセスじゃなければ、代わりの画像表示が行われる。

RewriteCond %{REQUEST_URI} !^dummy\.jpg$

ダミー画像へのアクセスは許可する。

RewriteRule \.(jpe?g|png|gif)$ dummy.jpg [NC,R,L]

パターンに一致するファイルにアクセスされたら、代わりに dummy 画像を表示する。

mod_rewrite を使わずに、画像ファイルへの直リンクを禁止する

<FilesMatch "\.(gif|jpg|jpeg)$">
SetEnvIf Referer "^http://mokuzine\.net/" ref_ok
SetEnvIf Referer "^http://www\.mokuzine\.net/" ref_ok
SetEnvIf Referer "^$" ref_ok
Order deny,allow
Deny from all
Allow from env=ref_ok
</FilesMatch>

各行を説明していく。

<FilesMatch "\.(gif|jpg|jpeg)$">

拡張子が、gif、jpg、jpeg のファイルのとき設定された内容を実行する。

SetEnvIf Referer "^http://mokuzine\.net/" ref_ok
SetEnvIf Referer "^http://www\.mokuzine\.net/" ref_ok

記載した URL のときに、リンクを許可する。

SetEnvIf Referer "^$" ref_ok

セキュリティーソフトなどによって、リファラーが消されている場合は、許可する。

自分のサイトにアクセスしてきた人でも、セキュリティーソフトによっては、リファラーが消される場合があるので。

Order deny,allow
Deny from all
Allow from env=ref_ok

いったんすべてのアクセスを拒否した後に、指定したら URL からのアクセスは許可する。

記載された設定は、上から順番に処理されるので、この様に有効にする設定を最後に書いている。

</FilesMatch>

設定の終了