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

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

ただいまの
回答率

89.05%

htaccessでリダイレクトとURLの正規化を行う混在した書き方がわからない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,064

seiji_maemura

score 121

問題の解決策やヒントを頂ければと思います。 
※以下に登場するドメイン名は仮称です。
※仮称のドメインを使うことにより正しい情報をお伝え出来ていませんでした
追記:「firstdomain」を「first-domain」に、「seconddomain」を「second-domain」に修正しました。また、実際は、www有りの「www.second-domain.com」です。

やりたい事

htaccessを用いて、リダイレクトとURLの「https」への正規化を行いたい。
「http(s)://first-domain.jp/folder/」を「https://www.second-domain.com」にリダイレクトの処理と「second-domain.com」へのアクセスのプロトコルすべて「https」に正規化したい。

状況

レンタルサーバー:さくらインターネット
・ルートには現在「first-domain.jp」を振っている
・「firstdomain.jp」直下のサブディレクトリ「folder」に「second-domain.com」を後から振った
・「first-domain.jp/folder/」へのアクセス時は「second-domain.com」への転送中
・「second-domain.com」をSSL化し「https」に正規化する必要が出てきた
・htaccessを調べて試行錯誤書いてみるも、転送処理と正規化処理を混在した書き方がわからずエラーばかり返ってくる

現在

URLの正規化もするために調べ、「mod_rewrite」と言うサーバーサイドの機能で、記述方法に違いがあったことを理解し、Wordpressも利用しているので「mod_rewrite」に合わせて記述してみましたが、エラーになるかCSSや画像などを読み込まなくなるなど一向に掴める気がしません。
もちろんURLの正規化も成功していないのですが…。
以下が調べて試してみたが成功しなかったhtaccessです。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^http://%(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}
RewriteRule /folder/ https://www.second-domain.com/
# BEGIN WordPress
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
</IfModule>


恐らくとてつもない勘違いで記法を間違っているか、そもそも技術的に不可能なのかもしれませんが、ご助言頂ければ助かります!
通常(?)の書き方でも「mod_rewrite」の書き方でもかまいませんので、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • TaichiYanagiya

    2016/03/03 21:36

    「正規化」とは?
    リダイレクトではなく、URL https://firstdomain.jp/folder/ のままにしたいということですか?

    キャンセル

  • seiji_maemura

    2016/03/04 13:17

    お伝えるすべき情報がわかり辛い表現になってしまって申し訳ありません。修正しましたので、ご助言を頂ければと思います。

    キャンセル

  • ogaaaan

    2016/03/04 13:24

    いや、『正規化』って何のこといってますか?という質問です。俺もわからないです。

    キャンセル

  • seiji_maemura

    2016/03/04 13:47 編集

    質問の意図を理解していませんでした、たびたび申し訳ありません。URLの正規化は調べた範囲では、URLの「www」ありなしを統一したりする事を指すようです。httpプロトコルでページアクセスがあった場合も、URLのプロトコルをhttpsに矯正する時に使われるようです。「正規化」と言う表現が一般的でなく、「要はリダイレクトでしょ」と言う事であれば、そのようになると思います。

    キャンセル

回答 1

checkベストアンサー

+1

「http(s)://firstdomain.jp/folder/」を「https://seconddomain.com」にリダイレクト

これは、編集前の Redirect permanent /folder/ https://seconddomain.com/ でもいいですし、mod_rewrite であれば下記のようになると思います。

RewriteRule ^folder/ https://seconddomain.com/ [R=301,L]


リダイレクトさせるため、フラグに「R=301,L」を設定。

「seconddomain.com」へのアクセスのプロトコルすべて「https」に

http://firstdomain.com/ は許可するのですよね。
%{HTTP_HOST} で判定して、下記のようになると思います。

RewriteCond %{HTTP_HOST} ^seconddomain\.com$
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


※RewriteRule の第1引数にはパスを設定します。プロトコル(http://)やホスト名は設定できません。

(2016/03/04 18:55 追記)

「CSSや画像が読み込まれない状態」はおそらく WordPress 用のルールにマッチしてしまっているのだと思います。
.htaccess の一部を folder/.htaccess 以下に移すとどうでしょうか。

(.htaccess)
Redirect permanent /folder/ https://www.second-domain.com/

# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
(folder/.htaccess)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.second-domain\.com$
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/07 15:51

    なるほど、プロセスは理解出来ませんでしたが、「RewriteCond %{HTTPS} off」がTrueを返し続ける事で、httpsへ置き換える処理が延々終らない…と言う事で認識あっていますか?

    RewriteCond %{HTTPS} off を使わない場合、初期に回答頂いた中の「※RewriteRule の第1引数にはパスを設定します。プロトコル(http://)やホスト名は設定できません。」の条件に引っかかり、サーバー構成の仕様で出来ないと言う決着になりそうでしょうか?

    着地は、「http」アクセスを「https」に常に置き換えてくれるだけでよかったんですが、思ったより原因は根深かったようですね…。

    キャンセル

  • 2016/03/07 16:16

    > 「RewriteCond %{HTTPS} off」がTrueを返し続ける事で、httpsへ置き換える処理が延々終らない
    SSL を前段のリバースプロキシーやロードバランサーで終端しているのであれば、そうだと思います。
    ブラウザから https:// でアクセスしても、Webサーバーには http:// で届くので。
    参考: http://cloudfish.hatenablog.com/entry/2015/08/30/184458

    前段のリバースプロキシーやロードバランサーの仕様によりますが、ブラウザからのアクセスプロトコルを別のヘッダに格納して Webサーバーに情報を渡す仕組みはありませんでしょうか。参考URL にある X-Forwarded-Proto など。

    キャンセル

  • 2016/03/07 17:37

    知識外でよく判っていませんが、ご提示頂いたサイトを見る限りでは、環境次第でループが起こるケースがあると言うのがわかりました。

    さくらサーバーを利用しているのですが「X-Forwarded-Proto」の文字と共に検索したら以下のエントリーの記述を見つけました。
    .htaccess の設定レシピ集
    https://murashun.jp/blog/20150918-01.html#chapter-4
    「さくらインターネットの SNI SSL では、上記の設定でリダイレクトループが発生します。 これは、さくらインターネットの HTTPS (SNI SSL) は、リバースプロキシとして動作しており、RewriteCond ディレクティブによる HTTPS 判定ができないためです。」

    TaichiYanagiyaさんのおっしゃられていた記述がありましたので、以下のソースで試して見た所、リダイレクトとhttpsの正規化に成功しました!!!
    ------------------------------------------------
    Redirect permanent /folder/ https://www.second-domain.com/

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    # END WordPress

    ------------------------------------------------
    数日に渡り、返答回答を重ねて頂いて無事成功する事が出来、大変助かりました。
    TaichiYanagiyaさん、ありがとうございます!

    キャンセル

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

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る