QA@IT

一部のページでのSSLの設定に困っています

9560 PV

SSL(https)にしたいのですが、全体ではなくて、お問い合わせページ等、一部ページに反映したくて困っております。

 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_URI} contact.php
RewriteCond %{HTTPS} off
 RewriteRule https://xxx.com/contact/ - [L]
 RewriteRule contact.php https://xxx.com/contact/ [R,L]

例えば上記のようにして、ドキュメントルート直下のcontact.phpにアクセスする時、httpsにするようにリダイレクトしたいのですが、
リダイレクトループ等になってしまいます。。。

てか、
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS} on
を同時に二つ書いてもRewriteされちゃって、どうすればよいですか?
htaccessで行うのは諦めた方が良いですか?
他にどのような方法があるでしょうか?
なにか良い記事はありますか?

ご教授ください。。。

【追記】
理由分かりました!まだでできていないですが、ロードバランサー使っているからでした。
http://d.hatena.ne.jp/komiyak/20130807/1375845025
http://blog.cloudpack.jp/2011/08/aws-news-elb-apache-http-or-https.html
これらが参考になり。。。

RewriteCond %{HTTP:X-Forwarded-Port} !^443$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteCond %{REQUEST_URI} contact.php
RewriteRule contact.php https://%{HTTP_HOST}/contact/ [R,L]

RewriteCond %{HTTP:X-Forwarded-Port} !^80$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteCond %{REQUEST_URI} !(contact.php)
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

ただ、これでもできないんですよね。。
↑これだとリダイレクトループしてしまいます。
(contactページ以外の時、httpで表示するっていう記述をいれたんですが。)

RewriteCond %{HTTP:X-Forwarded-Port} !^443$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteCond %{REQUEST_URI} contact.php
RewriteRule contact.php https://%{HTTP_HOST}/contact/ [R,L]

これだけならリダイレクトデキルんですが、urlで直接たたくとhttpsで表示したいところがhttpでも表示されてしまうので..

  • なるほど、ロードバランサですか。2番目の条件について追記しました。 -
  • とりあえずの目的は達成できたようですね。ただ現状だと https://~~/contact.php とアクセスすると /contact/ に飛ばされずそのまま表示されそうな気がします(他で制御してなければ)。 (現状のものはとっておいた上で)もう少し精査された方がいいかもしれません。 -

回答

RewriteCondを同時に2つというのはどういう状態ですか?

 RewriteCond %{REQUEST_URI} contact.php
 RewriteCond %{HTTPS} off
 RewriteCond %{HTTPS} on
 RewriteRule https://xxx.com/contact/ - [L]
 RewriteRule contact.php https://xxx.com/contact/ [R,L]

ですか?

 RewriteCond %{REQUEST_URI} contact.php
 RewriteCond %{HTTPS} off
 RewriteRule https://xxx.com/contact/ - [L]

 RewriteCond %{REQUEST_URI} contact.php
 RewriteCond %{HTTPS} on
 RewriteRule contact.php https://xxx.com/contact/ [R,L]

ですか?(こっちだと思いますが)

追記:

 RewriteRule https://xxx.com/contact/ - [L]

これって書き換わりますか?ハイフンって元のURLを使う指定ですし、${HTTPS} off で条件が「https:」 というのも違和感があります。

全然確認してないんですが

 RewriteCond %{REQUEST_URI} contact.php
 RewriteCond %{HTTPS} off
 RewriteRule ^ https://xxx.com/contact/ [R,L]

 RewriteCond %{REQUEST_URI} contact.php
 RewriteCond %{HTTPS} on
 RewriteRule contact.php https://xxx.com/contact/ [R,L]

たとえばこんな感じではダメでしょうか。


追記

参考にされたのは http://www.meibinlab.jp/nishijima/archives/54 こちらですかね。
ポートで判断している http://d.hatena.ne.jp/shimonoakio/20080226/1204089340 こんなページを見かけました。

あとよその過去の質問らしきところで

contact.phpをurl上はcontact/にしているのは関係あるんでしょうか?その辺りが怪しいような気がしています。
RewriteRule ^contact/(.*)$ contact.php [L]

というのを見かけましたが、Rewriteの設定はこの質問にあげているのですべてですよね?


追記 20130929 21:47

(1)
RewriteCond %{HTTP:X-Forwarded-Port} !^443$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteCond %{REQUEST_URI} contact.php
RewriteRule contact.php https://%{HTTP_HOST}/contact/ [R,L]

(2)
RewriteCond %{HTTP:X-Forwarded-Port} !^80$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteCond %{REQUEST_URI} !(contact.php)
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

2番目の条件なんですが、 (1)で http://xxx.com/contact.phphttps://xxx.com/contact/ となります。Rがついてるのでリクエストが発生しますね。
ポートが443なので(1)はスキップされます。
(2)の3番目の条件に !(contact.php) があるので、これにマッチしてしまうんではないでしょうか(すでに /contact/なので)。
/contact/$ も除外した方がいいように思います。

編集 履歴 (4)
  • 回答ありがとうございます!!嬉しいです。

    >RewriteCondを同時に2つというのはどういう状態ですか?
    それが上なんですよね..
    https://xxx.com/contact/にはリダイレクトされた状態になり、ただしリダイレクトループになります。

    指定されたもの、試しましたがダメでした。。。
    これもリダイレクトループが含まれていますとなります。。。
    -
  • サーバーがだめってことですかね。でも 他のページでhttpをhttps荷変えてアクセスするとできるんですよね。。 -
  • 「サーバーがだめ」っていうのはどういう意味でしょう? -
  • 追記しました、、まだできておりません。。。本当にありがとうございます。。 -
  • うおおお!できました!!ありがとうございます!! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。