copy_people copy_things copy_matter copy_heart copy_txt ttl_topics ico_blank ico_facebook ico_twitter ico_hatebu ico_index

2019/03/14

実務で使える.htaccessまとめ(Apache2.4系〜)

Written by 非公開: Miki Shima

  • server
  • Apache
  • htaccess

INDEX

    こんにちは、エンジニアの島です。

    春めいてきましたね。社内は花粉症ピークをむかえております。
    本日はホワイトデーでということで、弊社では男性陣からチョコレートのお返しをいただきました。わーい。

    さてさて。
    先日担当した案件で、公開前後に.htaccessを使ったアクセス処理をいくつか行ったのですが、

    • サーバーさわるし不可視ファイルだしなんかこわい・・・
    • ぐぐると書き方いろいろあってわからない・・・

    と、露頭に迷う(私のような)人がいればと、まとめてみました。

    ※ちなみに本記事に登場する例はすべてApache2.4系〜で動作確認済です。

    はじめに

    .heaccessって?

    Apache用の設定上書きファイルです。
    「このファイルが置いてある階層以下で、この条件のときこれしてね」という独自処理を追加したい場合に設置します。

    APACHE

    .htaccess ファイルの設定ディレクティブは .htaccess ファイルの存在するディレクトリと、そのサブディレクトリすべてに適用されます。

    ポイント1

    • 不用意に使わない。また管理範囲内のディレクトリで適用する。
    • Apacheのバージョンによって、書き方が異なる場合がある。(本記事はすべてApache2.4系〜です)
    • まずはテストサイトで動作検証してみる。
    • もしもうまく動かなかったら、まずリネームして無効にする。

    ポイント2

    .htaccessは不可視ファイル(.から始まる拡張子なしのファイル)のため、PCの環境に依っては作成・表示されないことがあります。そこで、
    htaccess.txt という名前で作成し、
    ②サーバーアップロード時に .htaccess にリネームする
    というフローで作業をすすめると、ファイル管理の面からもおすすめです。

    ひとまず上の2つさえおさえたら。
    早速!いってみましょう。

    1. BASIC認証
    2. 301リダイレクト
    3. URLの正規化
    4. 正ドメイン以外のアクセス拒否

    BASIC認証

    ディレクトリにアクセスする際、認証を行います。
    認証用ファイル(.htpasswd)に記載の内容と一致した場合にアクセスが許可されます。
    ユーザーだけでなく、Googleのクローラーのアクセスも防げます。

    公開前にはBASIC認証をかけましょう。

    利用シーン

    • 公開前サイト・テストサイト
    • 特定の人にしか見せたくないページ(会員限定ページなど)

    手順①:設定ファイルの作成

    BASIC認証を行うには、.htaccessだけでなく、パスワード用に.htpasswdというファイルも用意します。

    htaccess.txt

    <Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
    </Files>
    
    AuthUserFile /home/foo/bar/.htpasswd
    AuthName "Please enter your ID and password"
    AuthType Basic
    require valid-user 
    order deny,allow
    

    htpasswd.txt(ID:shima Password:shima で作成した場合)

    shima:rfUv8zv0DeeOY
    

    .htpasswdは、こちらのサイトなどで簡単に作成できます。

    ポイント

    • .htaccess用ファイル作成の際は、最後に改行を入れるのを忘れないようにしましょう。
    • 認証ファイルへのパス /home/foo/bar/.htpasswd は、サーバーのルートディレクトリからの.htpasswdへのフルパス(Macでいうと /usr/local/... とか /home/pass/... とか)を指定します。
      ※フルパスは、サーバーの契約書類かphpinfo等の表示内容で確認しましょう。

    うっかりドキュメントルートから書くとサーバーのルートを参照してしまいます。
    .htaccessはセキュリティ上、ドキュメントルート( http://〇〇〇.jp/ )より上の階層に置くことが多いことを考えると、フルパスで書く理由が腑に落ちますね。

    解説・その他(おまけ)

    • 上3行 <Files ~ "^\.(htaccess|htpasswd)$"></Files> は、「htaccess、htpasswdというファイルは、すべてのアクセス(all)を拒否(deny)します」という意味になります。いじられたら困りますものね、決まり文句みたいなものと思いましょう。
    • .htpasswd はサーバーによっては暗号化の方法が異なる場合があります。(MD5/SHA-1 など)※参考

    手順②:ファイルアップロード

    上記2つを作成したら、BASIC認証をかけたいディレクトリに、先ほどの2ファイルをアップロードします。
    アップロードが完了したら、

    • htpasswd.txt.htpasswd
    • htaccess.txt.htaccess

    にリネームします。

    手順③:動作確認

    該当ページにアクセスして動作確認しましょう。
    アクセス時にid/passの入力を求められ、設定した値でログインできればOKです。

    うまく動かないとき

    表示/動作がおかしい場合は、.htaccessを一度無効にして(_.htaccessなどにリネーム)、下記を確認してみてください。

    • ID、パスワードを求められない場合 ⇒ .htaccessファイルが間違っている可能性あり
    • パスワードが通らない場合 ⇒ フルパスもしくは.htpasswdファイルが間違っている可能性あり

    その他(おまけ)

    下記のサイトを使うと、簡単に.htaccessと.htpasswdを作成出来ちゃったりもします。

    htaccess Editor

    301リダイレクト

    301=恒久的な転送を意味します。
    デフォルトだと302(=一時的な転送)になるので、サイト引っ越しのときなどは301を明示します。
    Googlebotが認識すると、インデックスを貼り替えてくれます。

    利用シーン

    • クローズしたサイトにアクセスされたとき、別サイトに転送したい
    • 旧サイトのページURLと新サイトのページURLが異なるので転送したい

    設定ファイル作成

    下記は、同一サイト内での転送(『旧サイトではお知らせ用のディレクトリが/news/だったのが、新サイトでは/topics/になった』という場合)の記述です。

    htaccess.txt

    <Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    
    RewriteBase /
    RewriteRule ^news/(.*)$ /topics/ [R=301,L]
    RewriteRule ^privacy/(.*)$ /privary/policy/ [R=301,L]
    
    </IfModule>
    

    ポイント

    下記がリダイレクトの基本構文です。

    <IfModule mod_rewrite.c>
    RewriteEngine on
    
    RewriteBase /
    RewriteRule 転送前 転送後 [R=301,L]
    
    </IfModule>
    
    • 転送したいページ分、改行して RewriteRule を追加していきます。
    • 転送先が別サイトの場合、 RewriteRule ^news/(.*)$ http://〇〇〇.com/topics/ [R=301,L] というふうに指定します。

    解説・その他(おまけ)

    • RewiteBase / にはベースとなるディレクトリを意味します。特に指示がない場合/
    • ^news/(.*)$ 部分はPCRE形式の正規表現を使用して、「news/以下にアクセスされたらとにかくtopics/にとばしてね」という処理をしていますが、個別に書いてももちろん良いです。
    • mod_rewriteが使えない場合はRedirect ディレクティブを使った転送方法もあります。

    作成できたら、サーバーにアップロード→リネームして、動作を確認しましょう。

    URL正規化

    アスセスを一本化したい場合の転送設定です。
    先ほど同様、mod_rewriteを使います。
    SSL対応の際は、301を明示することでもとのURLのページ評価を引き継がせましょう。

    利用シーン

    • wwwなしでアクセスされたとき、wwwありのドメインにとばす(サブドメイン転送)
    • http://でアクセスされたとき、https://にとばす(SSL対応)

    設定ファイル作成

    下記はSSL対応の例になります。

    htaccess.txt

    <Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://〇〇〇.com/$1 [R=301,L]
    
    </IfModule>
    

    解説・その他(おまけ)

    • RewriteCond =リライトルールを適用する条件。 %{HTTPS} offhttpsではない場合 を意味します。
    • うまく動かない場合、レンタルサーバーのサポートに書き方がのっている場合もあるので、参考にしてみてください。(例:さくらのサポート情報

    応用

    例えば、301リダイレクトも書きたいし、SSL対応もしたい、といった場合にリライトルール以外の記述は1つにまとめても大丈夫です。

    <Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    
    # HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://〇〇〇.com/$1 [R=301,L]
    
    # PAGE
    RewriteBase /
    RewriteRule ^news/(.*)$ /topics/ [R=301,L]
    RewriteRule ^privacy/(.*)$ /privary/policy/ [R=301,L]
    
    </IfModule>
    

    といった具合になります。

    正ドメイン以外のアクセス拒否

    DNSの仕組み上、ドメインにIPを割り振られた場合、容易にミラーサイトが立てられてしまいます。
    あまり使うことはないかもしれませんが、ミラーサイト防止対策として、正ドメイン以外だったらサイトを表示させないようにします。

    利用シーン

    • 正ドメイン以外のアクセスをはじきたい

    設定ファイル作成

    構文は、上記URLの正規化と同様です。ステータスコード400(=Bad Request)を返却してサイトの閲覧を禁止します。

    htaccess.txt

    <Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    
    RewriteCond %{HTTP_HOST} !^〇〇〇.com$
    RewriteRule ^(.*)$ - [L,R=400]
    
    </IfModule>
    

    解説・その他(おまけ)

    • 「正ドメインでなかったら」はじきたいので、!^〇〇〇.com$ には正ドメインを書きます。(弊社サイトの場合、RewriteCond %{HTTP_HOST} !^www.evoworx.co.jp$ といった具合になります)

    春の一句
    「コピペから 使ってみるべし .htaccess」

    皆様の明日の実務に役立ちますように。島でした。

    CONTACT

    お仕事のご相談や、弊社についてのご質問や
    ご要望など、お気軽にお問い合わせください。

    View