.htaccessでの制御
Index
― 目次 ―.htaacessとは?
.htaacessは、WebサーバーであるApache環境下で利用できる「Webサーバーをディレクトリ単位で制御できるファイル」です。
主に、アクセス制限(BASIC認証など)、特定ページにアクセスがあった際のリダイレクト(URLが変更されたページを指定のページへリダイレクトさせるなど)、URLの正規化(SSL化されたURL:httpsにアクセスを統一する、URLをwwwなしのアクセスに統一する、URLのindex.htmlなしのアクセスに統一するなど)、PHPの設定、画像の直リンク禁止など、制御の種類は様々あります。
使用時の基本ルールとしては、「.htaccessを設置したディレクトリは、サブディレクトリを含む全てのファイルに効果が適応される点です。
それでは、私がWebサイト制作の時によく使う.htaccessでの制御をご紹介していきます。
URLの正規化
アクセス解析時などに、同一ページへのアクセスが数ページに分かれたりしないようにするための制御です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# リライト(書き換え)エンジンの有効化 RewriteEngine on # 常時SSL RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # URLをwww有りに統一 RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # URLにindex.htmlを表示しないでアクセス可能にする RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ https://ドメイン/$1 [R=301,L] # 拡張子の優先度 DirectoryIndex index.html index.php |
2行目が「リライト(書き換え)エンジンの有効化」です。毎回書く必要はありませんので、初めに1回記述します。
5~6行目が「常時SSL化」です。「http~」のアクセスも「https」のアクセスとして統一(リダイレクト)します。
9~10行目が「URLをwwwありに統一」です。「http://ドメイン」のアクセスも「http://www.ドメイン」に統一します。
13~14行目が「URLにindex.htmlを表示しないでアクセス可能にする」です。
17行目が「拡張子の優先度」です。WordPressなどを利用してWebサイトを制作している場合、index.phpを使用しますが、クライアントさんにhtmlでの表示確認だけをしてもらうような時などに使える記述です(※先に記述した方が優先度が高くなります)。「htpps://ドメインのアドレス」で確認してもらえます。Webサイトのリニューアル時にテスト環境で確認してもらう時、BASIC認証が設定された環境でのデザイン確認時に使用したりします。
PHPの設定
php.iniが編集できる場合、そちらに記述します。php.iniと.htaccessでは書き方が異なりますので、あとで説明します。
1 2 3 4 |
# phpの設定 php_value memory_limit 256M php_value post_max_size 128M php_value upload_max_filesize 64M |
2行目が「memory_limit」です。メモリの使用量の上限を指定します。
3行目が「post_max_size」です。 1回のアップロードの合計最大サイズを指定します。
4行目が「upload_max_filesize」です。 1ファイルあたりのアップロード最大サイズを指定します。
以下のように指定する必要があります。
memory_limit >= post_max_size >= upload_max_filesize
※「>=」→ 大なりもしくはイコール
php.iniでは、以下のように記述します。
1 2 3 4 |
; PHPの設定 memory_limit = 256M post_max_size = 128M upload_max_filesize = 64M |
※設定内容については、.htaccessと同じです。
php.iniと.htaccessの違いは?
php.iniと.htaccessのどちらでPHPの設定をすればいいの?を簡単に説明すると「PHPの実行環境の違い」によります。
Apacheモジュール版(mod_php)としてPHPを実行している場合、.htaccessでPHPの設定を変更することができます。
ですが、CGI版やFastCGIなどの実行モードでは、.htaccessファイルでPHPの設定を変更することはできません。
以下が主な違いです。
Apacheモジュール版としてPHPを実行している場合、PHPはApacheの一部として動作しますので、内部の他の処理やプログラムを一括して処理することができます。ですから、.htaccessを利用してPHPの設定を変更することも可能です。
※.htaccessで全ての変更が可能ということではなく、変更が可能な値は、php.iniファイル側の設定によります
CGI版としてPHPを実行している場合、.htaccessを利用してPHPの設定を変更することはできません。
※php.iniやPHPスクリプト内部でini_set()関数を使用することで変更することは可能です
FastCGIとしてPHPを実行している場合、.htaccessを利用して一部のPHPの設定を変更することは可能です。
※php_flagやphp_valueディレクティブを使用します(他の変更については、php.iniやPHPスクリプト内部でini_set()関数を使用する必要があります)
近年では、FastCGIと動作が似たLiteSpeed LSAPI(LiteSpeed Server API)なんかもあります。
FastCGIよりも高速に処理を実行できるのが特徴で、WebサーバとしてNginx(エンジンエックス)やApacheを採用しているサーバーでも利用することができます。
※処理速度でみると「LSAPI > FastCGI ≒ モジュール版 > CGI版」と言われています
※「≒」→ 同程度
画像の直リンクを禁止
「外部サイトで自身が運営しているホームページ画像が無断転載されている…それも直リンクで…」なんてことありますよね。
大量のWebサイトから直リンクを貼られてしまうと、サーバーの負荷にもつながります。
このような場合に使える「画像の直リンクを禁止する方法」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# リライト(書き換え)エンジンの有効化 RewriteEngine on # 画像へのリンクを許可するWebサイト RewriteCond %{HTTP_REFERER} !^http(s)?://ドメイン [NC] RewriteCond %{HTTP_REFERER} !google\. [NC] RewriteCond %{HTTP_REFERER} !googleusercontent\. [NC] RewriteCond %{HTTP_REFERER} !yahoo\. [NC] RewriteCond %{HTTP_REFERER} !bing\. [NC] RewriteCond %{HTTP_REFERER} !search\?q=cache [NC] # アドレスバーへの直接入力(リファラーなし)を許可 RewriteCond %{HTTP_REFERER} !^$ # SNSからの画像参照を許可 RewriteCond %{HTTP_USER_AGENT} !(twitter|Twitterbot|facebookexternalhit|fbcdn|google|hatena) [NC] # botのアクセスを許可 RewriteCond %{HTTP_USER_AGENT} !(googlebot|yahoo|bingbot) [NC] # 直リンク時に指定画像を表示 RewriteCond %{REQUEST_URI} !^https://www\.ドメイン/wp-content/uploads/direct_link_prohibited\.png$ RewriteRule \.(jpg|jpeg|png|gif|webp|svg)$ https://www.ドメイン/wp-content/uploads/direct_link_prohibited.png [NC,R,L] |
2行目が「リライト(書き換え)エンジンの有効化」です。毎回書く必要はありませんので、初めに1回記述します。
5~10行目が「画像へのリンクを許可するWebサイト」です。
5行目は「自ら運営しているWebサイトのURL」です(※こちらを記述しないと画像が表示されなくなりますので注意してください)。
6~9行目は「google、yahoo、bingでの画像検索の表示を許可 」です。
10行目は「検索サイトでのキャッシュ表示の際に画像の表示を許可するか」です(※許可する場合は記述してください)。
13行目が「アドレスバーへの直接入力(リファラーなし)を許可」です(※「直リンクは禁止ですが、アドレスバーへの直接入力は許可します」という内容です)。
16行目が「SNSからの画像参照を許可」です。X(Twitter)やfacebookなどのSNSの画像参照を許可します。
19行目が「botのアクセスを許可」です。有名な検索サイトに画像が表示されることのメリットは大きいため記述しています。
22~23行目が「直リンク時に指定画像を表示」です。
22行目は「直リンクを貼られた際に指定画像を表示したいので、その指定画像に関しては許可します」という内容です(※WordPressのuploadsディレクトリ内に指定画像を置いた場合を想定)。
1つ注意点としては、22行目の記述だけは「ドット」の前に「半角の円マーク(\)」を入力するのを忘れないようにしてください。
※半角の円マーク(\)・・・日本語環境と英語環境により文字コード「5C」が「円マークやバックスラッシュ(\)」となります
23行目は「jpg|jpeg|png|gif|webp|svg」で直リンクを禁止させるファイル形式を記述し、その後に「画像ファイルに直リンクを貼られた際、direct_link_prohibited.png画像を表示する」という内容です(※WordPressのuploadsディレクトリ内に指定画像を置いた場合を想定)。
例えば、以下のような感じです。
- Unauthorized reproduction of images is prohibited.:画像の無断転載禁止 -
一時的にPHPのエラーメッセージを非表示
WordPressでWebサイトを制作時、「クライアントさんに動作確認をしていただいている際、PHPのエラーが出力される」と困りますよね。
特に、導入しているプラグインに起因する場合(PHPのバージョンとプラグインとのバッティングなど)、直ぐに原因を特定することは困難です。
そんな時に利用できる「一時的にPHPのエラーメッセージを出力しない方法」です。
1 2 |
# 一時的にPHPのエラーメッセージを非表示 php_value display_errors Off |
2行目が「一時的にPHPのエラーメッセージを非表示」です。
※PHPのエラー内容が分からなくなりますので、「原因の特定 → 改修」を終えたら忘れずにコメントアウトしておきましょう
「Webサイト制作の際によく使う.htaccessでの制御」についてご紹介しました。
Webサーバーをディレクトリ単位で制御したい時に便利ですよね。
今回は、Webサイト制作の際によく使う.htaccessでの制御についてご紹介します。