###前提・実現したいこと
.htaccess設定の初心者です。
あるサイトでURL正規化(wwwあり→wwwなし)と常時SSL化(http://→https://)を行うために書籍等を参考に.htaccess内でrewriteをかけています。
サーバ構造は以下です。
- DocumentRoot
- ┣/script(第一階層)
-
┣a1.cgi(第二階層)
-
┣a2.cgi(第二階層)
-
┣XX.cgi(第二階層)
実現したいのは、当サイトに下記の条件1~4でアクセスした際に下記の結果A.およびB.に書き換えるということです。
条件1.http://~でアクセス
条件2.https://~でアクセス
条件3.http://www.~でアクセス
条件4.https://www.~でアクセス
結果A.XX.cgiにアクセスするときは必ずhttps://~に書き換え
結果B.a1.cgiまたはa2.cgiにアクセスするときは必ずhttp://www.~に書き換え
###発生している問題・エラーメッセージ
まず、下記コードの記述1を設定してXX.cgiに対して上記1~4の条件を実施してみると、期待通りに結果A.のhttps://~に書き換えられますが、a1.cgiおよびa2.cgiに対して上記1~4の条件を実施してみると、結果B.ではなくwww.無しのhttps://~(つまり結果A.と同じ)に書き換えられてしまいます。
そこで記述2を追記しましたが状況は変わりません。
###該当のソースコード RewriteEngine On #記述1 RewriteCond %{REQUEST_URI} !^(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} off RewriteRule ^(.*) https://example.jp%{REQUEST_URI} [L] #記述2 RewriteCond %{REQUEST_URI} ^(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} on RewriteRule ^(.*) http://www.example.jp%{REQUEST_URI} [L]
###試したこと
記述したコードの順番を前後いれ替えたりしてみましたが変化はありませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
エディター :TeraPad Version 1.09
FTPクライアント:ffftp Version 1.98g2
サーバOS :CentOS 6.7
httpサーバ :Apache 2.2.5
※サーバはスピーバーのレンタルVPSサーバを使用しています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
%{REQUEST_URI} はパスの先頭の /
を含みますので、以下のようにするといいと思います。
RewriteCond %{REQUEST_URI} !^(a1|a2)\.cgi$ ↓ RewriteCond %{REQUEST_URI} !^/(a1|a2)\.cgi$ RewriteCond %{REQUEST_URI} ^(a1|a2)\.cgi$ ↓ RewriteCond %{REQUEST_URI} ^/(a1|a2)\.cgi$
(2016/11/11 11:58) 追記
2つ目のルールで、下記リダイレクトはできていると思います。
https://www.example.jp/a1.cgi → http://www.example.jp/a1.cgi https://example.jp/a1.cgi → http://www.example.jp/a1.cgi
さらに、
http://example.jp/a1.cgi → http://www.example.jp/a1.cgi
としたいのでしょうか?
もし、そうれあれば、以下のルールを追加します。
RewriteCond %{REQUEST_URI} ^/(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^example\.jp [NC] RewriteRule ^(.*) http://www.example.jp%{REQUEST_URI} [L]
(2016/11/11 19:01) 追記
というのは、https://example.jp/a1.cgi でアクセスしてもそのままでリダイレクトされない(2つ目のルールが効かない)ということですか?
それとも、http://www.example.jp/a1.cgi でアクセスすると https://example.jp/a1.cgi にリダイレクトされる(1つ目のルールが効いてしまう)ということですか?
どちらの場合も「RewriteCond %{REQUEST_URI} ...」の条件に合致していないように思います。
a1.cgi(第二階層)
の「第二階層」とは、ファイルは (DocumentRoot)/script/a1.cgi にあるということですか?
よくわかりませんが、以下のように「^」(先頭)という条件を省くとどうでしょうか。
2つ目、3つ目のルールをまとめました。
RewriteEngine On RewriteCond %{REQUEST_URI} !/(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} off RewriteRule ^(.*) https://example.jp%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} /(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} on [OR] RewriteCond %{HTTP_HOST} ^example\.jp [NC] RewriteRule ^(.*) http://www.example.jp%{REQUEST_URI} [R,L]
あとは、Y.H. さんの回答のとおり、デバッグログを調べるといいと思います。
(2016/11/14 17:19) 追記
a1.cgi → http://example.jp/script/a1.cgi (www. なし)にリダイレクトする設定。
RewriteEngine On RewriteCond %{REQUEST_URI} !/(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} off RewriteRule ^(.*) https://example.jp%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} /(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} ^(www\.)?example\.jp [NC] RewriteCond %{HTTPS} on RewriteRule ^(.*) http://example.jp%{REQUEST_URI} [R,L]
投稿2016/11/11 00:37
編集2016/11/14 08:19総合スコア12202
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
回答ではないですが調査方法を。
httpd.conf を変更できるなら以下のようにログを出力し原因を探ってください。
Other
1RewriteLog "/tmp/rewrite.log" 2RewriteLogLevel 9
投稿2016/11/11 02:44
総合スコア7918
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。