サーバーを触っているとなんども.htaccessの設定を行うのですが、毎回いろんなところから調べて設定をしなければならないので、自分なりに一度しっかりとまとめなければと思いました。
何ができるのかと、どんな設定があるのかをまとめていきます。またそれぞれのサンプルを載せておきます。最後にWordPressの設定も載せておきます。
とりあえず何ができるのか?
すごいざっくり書くとこんな感じです。
- リダイレクト
- デバイスの指定のリダイレクト
- wwwの統一(URLの正規化)
- ブラウザキャッシュ
- 404ページ設定
- ベーシック認証
- アクセス制限
もちろん他にもたくさんできることはあります。これらを解説していきます。
リダイレクト
301リダイレクトを行います。例えば、ブログを移転した際に、urlを新しくすると、seoなどはリセットされてしまいます。そのため、以前のURLが持っているSEOを引き継いで転送を行うことができます。
301とはこのアドレスは違うアドレスに移動しましたというエラーのことで、つまり違うアドレスだったので他のアドレスにリダイレクトさせますっていうのが301リダイレクトです。
「old.html」にアクセスがあった際に「http://sample.com/new.html」へ301リダイレクトさせる記述です。
RewriteEngine on
RewriteRule ^old.html$ http://sample.com/new.html [L,R=301]
新しいサイトと古いサイトの違いがドメインだけという場合は、
Redirect permanent / https://new.com/
こちらの設定でOKです。permanent(恒久的に) 、リダイレクトさせるという意味です。
デバイスの指定のリダイレクト
レスポンシブではなく、スマホとpcでサイトを分けている場合、
iPod|iPhone|iPad|Android|Windowsで閲覧した場合、ファイル名の前にsp/を付与するという場合。
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ sp/$1 [R]
RewriteBase /
spを含むURLをiPod|iPhone|iPad|Android|Windows以外で閲覧した場合は、URLからsp/を取り除くという設定です。
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ $1 [R]
RewriteBase /
スマホからのアクセスを全てトップページにリダイレクトさせる場合。
RewriteEngine on
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ sp/ [R]
RewriteBase /
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ / [R]
RewriteBase /
wwwの統一(URLの正規化)
Google では同じドメインでも www の有無よってそれぞれを異なる Web サイトと認識してしまうため、両方の URL で同じコンテンツにアクセスすることができる場合は URL の正規化を行う必要があります。
wwwが有から無へ変更
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.sample\.com
RewriteRule ^(.*)$ https://smaple.com/$1 [R=301,L]
wwwが無から有へ変更
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(sample\.com)
RewriteRule ^(.*)$ http://www.sample.com/$1 [R=301,L]
ブラウザキャッシュ
Webサイトの高速化でよく使われます。表示スピードは SEO にも結構影響を与えるので、.htaccessでしっかり設定しておくのが大事です。
ExpiresDefaultで、デフォルトの期限切れ期日の計算アルゴリズムを設定することができます。以下はキャッシュの初期化、デフォルトの設定を1秒に設定した場合の例です。
ExpiresDefault "access plus 1 seconds"
個別の設定
png ファイルに対してキャッシュが破棄されるまで 1 週間の期限を設けた場合。以下のようになります。
ExpiresActive On
ExpiresByType image/png "access plus 1 weeks"
最初の"ExpiresActive On"というのはExpiresActiveを使います。ということなのでおまじなだと思っておきましょう。
上記の書き方は代替期間指定構文と呼ばれ、ExpiresByTypeとExpiresDefaultは、より読み易い構文を使って定義することができます。
本来は以下のような書き方をします。しかし、簡単に書くことができるので、一般的に使われているのは上記の書き方です。
ExpiresByType MIME-type <code>seconds
secondsには、期限切れの日時を秒数で設定します。
Cache-Control: max-age は期限切れの日時からリクエスト日時を引いたものを秒で表すことで生成されます。
期限切れの基準となる日時は、ファイルの最終更新日時か、ドキュメントへのアクセス日時です。どちらを使うかは<code>によって指定します。<code>には、MかAを指定できます。M はファイルの最終更新日時。Aはドキュメントへのアクセス日時になります。
ExpiresActive On
# gif 画像はアクセス日時から 1 ヶ月間有効にする
ExpiresByType image/gif A2592000
# HTML ドキュメントは最終更新日時から 1 週間有効にする
ExpiresByType text/html M604800
404ページ
エラーページをカスタマイズは"ErrorDocument" を利用することで、HTTPステータスコードに応じたページを返すことができます。httpステータスコードはこちらをご覧ください。
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 503 /503.html
このように設定することができます。
Basic認証
こちらのサイトを参考にしました。webサイトに必要最低限の認証設定をかける時に使うBasic認証にもhtaccessを使用します。
AuthUserfile /フルパス/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
AuthUserfile:認証に使用するユーザとパスワードの一覧が格納されている、テキストファイル名のこと。そのファイルまでの相対パスでも絶対パスを記載します。
AuthGroupfile:証認に使用するユーザグループの一覧が格納されている、テキストファイルの名のことで、そのファイルまでの相対パスまたは絶対パスを記載します。
AuthName:Basic認証などを行う際に出力される、ダイアログに表示されるメッセージを指定することができます。利用者がどのユーザ名とパスワードを入力すれば良いかを教えるために利用します。日本語も設定可能ですが、サーバやブラウザによって文字化けを起こす可能性があるため、半角英字で設定した方が無難です。また、メッセージにスペースが含まれる場合は "
で囲む必要があります。
AuthType:ユーザー認証の種類を指定。Basic または Digest が使用可能。
require:認証されたユーザがリソースに対してアクセスできるかを制御。
アクセス制限
不正なアクセスを遮断したり海外からのアクセスを制限したりします。
DDos攻撃への対策でもアクセス制限が設定されています。
ドメイン:sample.com、IPアドレス:192.168.1.1 とします。
アクセスを制限する場合
order allow,deny
allow from all
deny from sample.com
deny from 192.168.1.1
アクセスを許可する場合
order deny,allow
deny from all
allow from sample.com
allow from 192.168.1.1
また、ファイル単体に対して指定することもできます。
sample.htmlというファイルにアクセスを許可する場合は、以下のようになります。
<files sample.html>
order deny,allow
deny from all
allow from sample.com
allow from 192.168.1.1
</files>
500エラーになったら
.htaccessを編集していて、500 Internal Server Errorになったらおそらく記述が間違っているので見直しましょう。.htaccessはサイトの閲覧全体に影響するので、必ずバックアップを取りましょう。その上で素早く対応することが必要です。
WordPressの.htaccessの設定
また設定を間違えると、理解していない場合、復旧が難しくなってしまうので、.htaccessの設定は必ずバックアップを取ってから行いましょう。一般向けと、上級者向けに分けて書きます。上級者向けはセキュリティに関しての設定です。
一般向け
以下を.htaccessの一番下にコピペしてください。
# gzipで圧縮して転送する
<ifModule mod_deflate.c>
<IfModule mod_filter.c>
# Mozilla4、IE7-8は正しく動作しないので制限をかける
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html
#圧縮するコンテンツタイプを指定
AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain
AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf
AddOutputFilterByType DEFLATE font/truetype font/opentype
</IfModule>
</ifModule>
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# RSS
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rdf+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# データはキャッシュさせない
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/schema+json "access plus 0 seconds"
ExpiresByType application/vnd.geo+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
# マニフェスト
ExpiresByType application/manifest+json "access plus 1 week"
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# 画像や動画
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Webフォント
# Embedded OpenType (EOT)
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType font/eot "access plus 1 month"
# OpenType
ExpiresByType font/opentype "access plus 1 month"
# TrueType
ExpiresByType application/x-font-ttf "access plus 1 month"
# Web Open Font Format (WOFF) 1.0
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType font/woff "access plus 1 month"
# Web Open Font Format (WOFF) 2.0
ExpiresByType application/font-woff2 "access plus 1 month"
# Other
ExpiresByType text/x-cross-domain-policy "access plus 1 week"
</IfModule>
上級者向け
wordpressのセキュリティ的に、度々脆弱性が見つかることがあります。
よくある設定としては「サイトの管理画面へのアクセスを"自分"のみに限定し、それ以外は全て遮断する事」です。これにより、不正ログイン、改ざんなどを防ぐことができます。
your_global_IP_addressはアクセスを許可するグローバルIPアドレスです。適宜設定してください。
ルートディレクトリ直下の.htaccess
<Files wp-login.php>
Order deny,allow
Deny from all
Allow from your_global_IP_address_1
Allow from your_global_IP_address_2
</Files>
wp-admin/以下の.htaccess
Order deny,allow
Deny from all
Allow from your_global_IP_address_1
Allow from your_global_IP_address_2
サイトが国内のみを対象としている場合
自分のサイトが国内のみを対象としている場合、海外からのアクセスは必要ありません。
こちらにアクセスを制限する対象のIPアドレスがまとめっているhtaccessをダウンロードできるサイトがあります。そして、ダウンロードを行い設置してください。
以上です。