検索
カレンダー
2016年12月
« 4月    
 123
45678910
11121314151617
18192021222324
25262728293031
ブログメニュー

.htaccessだけでSSL対応するには

2006年10月22日

SSLを考えずに作られているページを、.htaccessだけの変更でSSL対応する方法をご紹介します。
もちろん、サーバがSSLに対応している必要はありますが…。
さらに.htaccessとmod_rewriteが入っている必要もあります。

SSLページにしたいHTMLファイル(PHP等でも可)のあるディレクトリに.htaccessファイルを作成し、下の文を追加します。

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

ファイルを個別に指定したい場合はちょっと面倒ですが下記のようにします。
ここでは例としてfoo.htmlとbar.htmlをSSLページとし、それ以外はSSLでないページとします。

RewriteEngine on

RewriteCond %{REQUEST_URI} .*/foo.html$ [OR]
RewriteCond %{REQUEST_URI} .*/bar.html$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} !(.*/foo.html$)
RewriteCond %{REQUEST_URI} !(.*/bar.html$)
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

(2007/10/31追記)
RewriteEngine on の記述が抜けていたので追記しました。指摘してくださったタルさん、ありがとうございました。

19件のコメント »

  1. mod_rewriteでのhttps→httpのがうまくいかず2日間さまよっていたところ、こちらにたどり着き、やっと解決しました。
    当たり前すぎて省略されているのか、なくても動く環境があるのかわかりませんが、私の場合、これらの記述の上に
    RewriteEngine On
    RewriteBase /
    が必要でした。
    ありがとうございました。

    Comment by タル — 2007/10/31 @ 9:51:27

  2. お役に立てたようでよかったです。
    記述の抜けの指摘ありがとうございます。早速反映しました。
    RewriteBaseですが、これは環境によって変わる可能性があるので書かないでおきました。

    Comment by nishijima — 2007/10/31 @ 16:58:53

  3. すいません。もしよろしければ、ひとつ教えていただけないでしょうか?
    こちらで教えていただいた方法で、順調に設定できていたのですが、サイトルート(public_html)のindex.htmlはじめいくつかのhtmlファイルをhttpsからhttpにリダイレクトさせようとして、半日以上いきづまってます。index.htmlをリダイレクトするように設定すると、当然のことながら、以下の階層のindex.htmlすべてが影響を受けます。どのようにすれば、サイトルートのindex.htmlだけを指定できますでしょうか?正規表現などの勉強不足なのを棚に上げて、あつかましい質問して申し訳ないのですが、よろしければ教えてください。

    Comment by タル — 2007/10/31 @ 18:09:08

  4. ファイルのパスが固定されているのでしたら、ファイル名を明示すればよいと思います。
    例えばサイトルートのindex.htmlとindex2.htmlだけHTTPでそれ以外をHTTPSにしたい場合は次のようになります。

    RewriteEngine on

    RewriteCond %{REQUEST_URI} ^/index.html$ [OR]
    RewriteCond %{REQUEST_URI} ^/index2.html$
    RewriteCond %{HTTPS} on
    RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    RewriteCond %{REQUEST_URI} !(^/index.html$)
    RewriteCond %{REQUEST_URI} !(^/index2.html$)
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    正規表現を駆使できればもう少しスマートにできるかもしれませんが、ここに書ける正規表現てすごく制限があるんですよね(^^;

    Comment by nishijima — 2007/10/31 @ 19:01:00

  5. ばっちりいけました。
    本当に助かりました。ありがとうございました。
    また、訪問させていただきます。

    Comment by タル — 2007/10/31 @ 19:29:53

  6. お役に立ててよかったです。
    今後とも宜しくお願いします。

    Comment by nishijima — 2007/10/31 @ 19:30:52

  7. SSL対応するディレクトリを個別に指定する…

    特定のディレクトリにのみ、SSLを有効にさせる.htaccess記述

    サーバ側で.htaccessとmod_rewriteが組み込まれていることが前提。
    SSLを有効 (more…)

    トラックバック by WORK NOTE BLOG — 2008/10/9 @ 18:31:26

  8. [...] ある技術者の備忘録 http://www.meibinlab.jp/nishijima/archives/54 [...]

    ピンバック by 相対アドレスのまま、指定ページのみHTTPSにする方法 | 決まらないタイトル。決まるスケジュール。 — 2009/10/27 @ 12:04:18

  9. 某会社のHP担当をしております。
    お問い合わせページをPHP組み込みで作成したのですが…HTTPSにしたく悩んでおります。勉強不足であり、元来、頭もあまりよくないのであれこれネット検索で調べてたらこのサイトを発見しました。

    一方的で申し訳ありませんが、HTTPS化の方法をご教授していただければと存じます。
    初めにサイトの上の方にある記載.htaccessを作成し当方のtopページ直下に配置した処、HPが参照できなくなりました。(ページが固まります。)
    ご説明を見る限りでは、topページ以下、HTTPSになるのかな?と思ったのですが…

    .htaccessファイルの内容
    ———————————————————–
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    ———————————————————–

    これ以外になにか設定が必要なのでしょうか?あつかましいお願いですが教えて頂ければ助かります。

    最終的には お問い合わせページのみ HTTP → HTTPSにする事が目標です。

    現在の条件は以下に記載します。
    ①HTML(全ページ)は特に、HTTPS化の記載はありません。
    ②お問い合わせページはPHPを組み込んで作成しております。
    ③wwwサーバーはSSL証明書をもっております。
    ④HPはホームページビルダーで作成してます。

    以上です。

    Comment by HP担当初心者 — 2016/6/2 @ 17:16:01

  10. お問い合わせの件ですが、問題の切り分けを先に行う方がよいかと思います。
    まず、ページが固まるというのはどのような状態でしょうか。
    1.サーバからの応答がない
    2.連続してリダイレクトが発生している
    3.応答の内容が空
    一般的には上記のいずれかかと思います。
    それによって対策が変わってきます。
    (確認には開発者ツールなどを使用して下さい)

    1の場合はサーバ内で転送がループしている等が原因です。
    ログに原因が記録されているかもしれません。

    2の場合は.httaccessの記述が間違っている可能性があります。
    RewriteCondが正常に動作していないなどが原因かと思われます。

    3の場合はHTTPステータスを確認する必要があります。
    200番代以外の場合はサーバのログを確認してください。

    また、PHPで作成されているということですが、
    何らかのフレームワークを使用されている場合は
    .htaccessの他の記述が原因の可能性もあります。

    それから、レンタルサーバにて運用されている場合は
    SSLで接続するページは別ディレクトリに設置することになっている会社もあります。

    Comment by nishijima — 2016/6/2 @ 17:35:29

  11. ご返事ありがとうございました。
    詳しく応答時の状況を記入しておらず申し訳ありませんでした。

    固まるというか…何か考えてるようなのですが更新ボタンを押すと以下のメッセージが返答されます。
    ———————————————————-
    Forbidden
    You don’t have permission to access / on this server.
    ———————————————————-
    アクセス権がないとか…なんですかね?

    wwwサーバーに設置する際は、
    teraPadで.htaccessを作成してFFFTPで転送をかけてます。

    属性は”644″です。

    作成方法とか設置方法は間違ってるのでしょうか?
    すみません。お手数とは存じますが、教えて頂ければ助かります。

    Comment by HP担当初心者 — 2016/6/4 @ 14:57:49

  12. 解決いたしました。
    私の設置ミスでした。このような場をお借りさせていただきました事、お礼申し上げます。
    ありがとうございました。

    Comment by HP担当初心者 — 2016/6/16 @ 15:07:01

  13. 解決されたようでよかったです。
    もし差し支えなければ、同様の症状に悩まされている方のために
    どのような原因だったか教えていただければ嬉しいです。

    Comment by nishijima — 2016/6/16 @ 16:44:23

  14. 初めて投稿させていただきます。
    htaccessについていろんな所を拝見させて同じようにしているのですが、うまくゆかず、こちらにたどり着きました。
    サーバーに関しては全くの初心者なのですが、是が非でも動かしたいので何卒ご教授お願いいたします。

    http → httpsへリダイレクトをしたいです。
    ———————————————————–
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    ———————————————————–
    もしくは
    ———————————————————–
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://www.弊社ドメイン [R,L]
    ———————————————————–
    としてもどちらも半分成功しませんでした。各々 %{HTTPS} off の個所を%{SEREVER_PORT} 80 としても結果は同じでした。

    成功したのは、
    http://テストサーバードメイン とアドレスバーで入力すると https://www.弊社ドメイン へ表示されました。

    不成功は、
    http://www.弊社ドメイン → https://www.弊社ドメイン とはなりませんでした。

    ドキュメントルートはhttpもhttpsも同じです。

    お忙しい所恐縮ですが、よろしくお願いいたします。

    Comment by サーバー担当若葉マーク — 2016/9/29 @ 14:53:25

  15. テストサーバでは転送が成功しているようですので、.htaccessの記述には間違いないと思います。
    リダイレクトされないということですので、本番サーバで.htaccessが許可されていない、もしくはmod_rewriteが使用できないのどちらかではないでしょうか。

    Comment by nishijima — 2016/9/29 @ 15:08:07

  16. 早急の返事、ありがとうございます。

    詳細に記載させていただきますと、
    テストサーバも本番サーバも同一環境なのです。言い返させていただきますと

    テストドメイン・本番ドメイン、どちらも同一ディレクトリを見ているので、テストドメインで使用するディレクトリを作成し、
    そのディレクトリの中に本番で設定しているディレクトリをコピーし、テストドメインのドキュメントルートを作成したディレクトリに設定したら成功した となります。

    本番ドメインで設定しているドキュメントルートのディレクトリの中に成功したと思われる.htaccessを入れてテストしてみたら出来ませんでした。

    全く意味が違うということだったでしょうか。そうでしたら、大変申し訳ございませんでした。

    もうひとつ記載させていただきますと、テストドメインは弊社ドメインと全く違いますので、前回記載させていただいた不成功は本番環境で初めて実行しました。

    文章ばかりなので記載している意味がお分かりいただけているでしょうか。
    何卒ご教授お願いいたします。

    Comment by サーバー担当若葉マーク — 2016/9/29 @ 15:59:36

  17. 別のドメインで同じディレクトリを参照されているということですが、バーチャルホストでしょうか。
    ドメインごとに別々の設定がされていると思いますが、御社ドメインで.htaccessとmod_rewriteが動作することを確認してみてください。

    例えば、.htaccessに「test」などといった適当な文字列を記述し、アクセスした時にInternal Server Errorが発生するかどうかで、.htaccessが有効かどうかを確認できます。

    Comment by nishijima — 2016/9/30 @ 16:28:15

  18. ご返答ありがとうございます。

    先ほどリダイレクトの成功を収めることができました。

    原因は、NETの方々と同じ記述をしてはいけない個所があった為でした。
    (ドメイン以下のページの個所)

    お騒がせをしてしまい申し訳ございませんでした。

    しかし、藁をもすがる気持ちでこちらにたどり着きましたので大変ありがたかったです。

    ありがとうございました。

    Comment by サーバー担当若葉マーク — 2016/10/4 @ 17:01:26

  19. 無事に解決されたみたいでよかったです。
    あまりお力になれなくてすみません。

    Comment by nishijima — 2016/10/4 @ 17:54:16

TrackBack URL : http://www.meibinlab.jp/nishijima/archives/54/trackback

コメントする