質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

2回答

2458閲覧

.htaccessのURL書き換えがうまくいきません。

thanatos04050jk

総合スコア19

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2016/11/10 10:51

編集2016/11/11 07:17

###前提・実現したいこと
.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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2016/11/11 03:06

"exsample"は質問記載時の誤記ですか? "exsample"と"example"が混在してますが・・・
thanatos04050jk

2016/11/11 04:46

ご指摘の件はexampleの誤記でしたので訂正させていただきました。
guest

回答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://exsample.jp/a1.cgiとなってしまいます。

というのは、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
TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thanatos04050jk

2016/11/11 02:38

早速のご回答有難うございます。ご回答の様に記述を変更してみましたが状況はかわりませんでした。
thanatos04050jk

2016/11/13 15:21

ご連絡が遅れて申し訳ありませんでした。 再追記でいただいた「^」(先頭)という条件を省く方法を試行してみましたが、Firefoxで「ループしている」という警告が出てしまいます。 なお、(2016/11/11 19:01) 追記でご指摘の「https://exsample.jp/a1.cgiとなってしまいます。」については当方の記述ミスで正しくは「https://exsample.jp/script/a1.cgiとなってしまいます。」です。 したがって次のご指摘点の回答としては「ファイルは (DocumentRoot)/script/a1.cgi にある」ということです。 上記のご指摘点については、当方の記述や図示がいたらなかったことに起因するもので、ご理解を困難にしてしまい申し訳ありませんでした。
TaichiYanagiya

2016/11/14 04:41

https:←→http: でループしているのか、http: 内でループしているのか、access_log, ssl_access_log などでわかりませんでしょうか。 切り分けのため、Location: ヘッダを確認したいのですが、サーバーのシェル(コマンドプロンプト)から「curl -k -D - -H "Host: example.jp" https://127.0.0.1/script/a1.cgi」コマンドを実行して、「Location: http://www.example.jp/script/a1.cgi」のように出力されているか確認してもらえないでしょうか。 同様に、リダイレクト後の URL に「curl -k -D - -H "Host: www.example.jp" http://127.0.0.1/script/a1.cgi」とアクセスして応答が「HTTP/1.1 200 OK」なのか「HTTP/1.1 302 Found」なのか確認してもらえないでしょうか。
thanatos04050jk

2016/11/14 06:34

以下に実行時のログとご指摘のコマンドの実行結果を記載いたします。 # access_log [14/Nov/2016:14:58:45 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:45 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:46 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:47 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:47 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:47 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:48 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:48 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" [14/Nov/2016:14:58:49 +0900] "GET /script/a1.cgi HTTP/1.0" 302 541 "-" "ブラウザ情報(~省略~)" # access_ssl_log [14/Nov/2016:14:58:43 +0900] "GET /script/a1.cgi HTTP/1.0" 302 3691 "-" "ブラウザ情報(~省略~)" # コマンド1 curl -k -D - -H "Host: example.jp" https://xxx.xxx.xxx.xxx(サーバのIP)/script/a1.cgi HTTP/1.1 302 Found Server: xxxxxx Date: Mon, 14 Nov 2016 06:02:39 GMT Content-Type: text/html; charset=iso-8859-1 Content-Length: 313 Connection: keep-alive Location: http://www.example.jp/script/a1.cgi <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="http://www.example.jp/script/a1.cgi">here</a>.</p> <hr> <address>Apache Server at example.jp Port 443</address> </body></html> # コマンド2 curl -k -D - -H "Host: example.jp" http://xxx.xxx.xxx.xxx(サーバのIP)/script/a1.cgi HTTP/1.1 302 Found Server: xxxxxx Date: Mon, 14 Nov 2016 06:08:27 GMT Content-Type: text/html; charset=iso-8859-1 Content-Length: 312 Connection: keep-alive Location: http://www.example.jp/script/a1.cgi <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="http://www.example.jp/script/a1.cgi">here</a>.</p> <hr> <address>Apache Server at example.jp Port 80</address> </body></html>
TaichiYanagiya

2016/11/14 06:41

コマンド2 の Host: ヘッダが違います。 -H "Host: www.example.jp" で試してみてください。
thanatos04050jk

2016/11/14 06:49

申し訳ありませんでした。 以下に正しいコマンド2の実行結果を記載いたします。 # コマンド2(再試行) curl -k -D - -H "Host: www.example.jp" http://xxx.xxx.xxx.xxx(サーバのIP)/script/a1.cgi HTTP/1.1 301 Moved Permanently Server: xxxxxx Date: Mon, 14 Nov 2016 06:42:46 GMT Content-Type: text/html Content-Length: 178 Connection: keep-alive Location: http://example.jp/script/a1.cgi <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>xxxxxx</center> </body> </html>
TaichiYanagiya

2016/11/14 08:16

"www.example.jp"→"example.jp" にリダイレクトするルールがどこかにあるようです。 サーバー側 httpd.conf かもしれません。 このルールを無効にするか、もしくは、a1.cgi も http://example.jp/script/a1.cgi (www. なし)にリダイレクトするかどちらかにするしかないと思います。 後者の設定を回答に追記します。
thanatos04050jk

2016/11/15 15:00

TaichiYanagiyaさんの > "www.example.jp"→"example.jp" にリダイレクトするルールがどこかにあるようです。 > サーバー側 httpd.conf かもしれません。 とのご指摘でhttpd.confを調べてみたところそれらしき記述はありませんでしたが、当該サーバがPlesk(サーバーコントロールパネル)を使用していることを思い出し、Pleskでの設定を再確認したとこドメイン設定でwwwなしのexample.jpが優先となる設定箇所があったため、これをoffにしたところ無事www.example.jpにリダイレクトさせることができました。 ただし、xx.cgiにhttps://www~でアクセスする際にリダイレクト後のURLがhttps://www~になってしまい、実現したい結果A.を満たさなくなってしまう事象が発生しました。 そこでいままでご教示いただいた記述を参考に以下の通りに記述したところ、実現したい結果A.及びB.を満足することができました。 つきましては、頼ってばかりで申し訳ありませんが以下の記述で問題ないか、あるいはもっと簡略化できる等のアドバイスをいただけないでしょうか。 RewriteEngine On RewriteCond %{REQUEST_URI} !/(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} example\.jp$ [NC] RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.example\.jp [NC] RewriteRule ^(.*) https://example.jp%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} /(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} example\.jp$ [NC] RewriteCond %{HTTPS} on #RewriteCond %{HTTP_HOST} ^example\.jp [NC] RewriteRule ^(.*) http://www.example.jp%{REQUEST_URI} [R,L] よろしくお願いいたします。
thanatos04050jk

2016/11/15 15:09

誠にすみません。 先ほど投稿した記述にミスがありました。 正しい記述は以下です。 RewriteEngine On RewriteCond %{REQUEST_URI} !/(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} example\.jp$ [NC] RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.example\.jp [NC] RewriteRule ^(.*) https://example.jp%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} /(a1|a2)\.cgi$ RewriteCond %{HTTP_HOST} example\.jp$ [NC] RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^example\.jp [NC] RewriteRule ^(.*) http://www.example.jp%{REQUEST_URI} [R,L]
TaichiYanagiya

2016/11/16 03:18

2つ目のルールで、[OR] が必要だと思います。 RewriteCond %{HTTPS} on ↓ RewriteCond %{HTTPS} on [OR] http://example.jp/script/a1.cgi →http://www.example.jp/script/a1.cgi もリダイレクトしたいのですよね。
thanatos04050jk

2016/11/16 06:11

ご指摘の通り2つ目のルールの[OR]を確認したところすでに記述済みでした。 確認不足のコードを記載してしまって申し訳ありませんでした。 今回は初投稿のため東宝の質問の仕方や現状確認に不備が多々あり、スムーズなキャッチボールを困難にしてしまいましたが、いただいたご指摘やご意見をもとにこれからの質問投稿に生かしていきたいと考えます。 長い時間お付き合いさせてしまいましたが、的確なアドバイスをいただきまして本当にありがとうございました。
guest

0

回答ではないですが調査方法を。
httpd.conf を変更できるなら以下のようにログを出力し原因を探ってください。

Other

1RewriteLog "/tmp/rewrite.log" 2RewriteLogLevel 9

投稿2016/11/11 02:44

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thanatos04050jk

2016/11/11 04:34

ご指摘の方法を試してみようと思いますがhttpd.confのどの部分に記述すればいいでしょうか。
Y.H.

2016/11/11 04:45

一番最後にでも追加してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問