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

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

ただいまの
回答率

90.12%

サブディレクトリのリダイレクト設定が一部正しく機能しない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,197

uzushio

score 7

前提・実現したいこと

『製品紹介サイト』と『製品販売サイト』をwordpressで作成中です。
同ドメイン内の2つのサブディレクトリ(wp、shop)それぞれにwordpressを入れ、
製品紹介サイトはルートディレクトリで表示されるように設定し、
下記のようなURLの2つのサイトができました。
https://sample.com
https://sample.com/shop/

この2つのサイトに.htaccessによるリダイレクトをかけるため、
『ルートディレクトリ』『/wp/ディレクトリ』『/shop/ディレクトリ』
の3箇所に.htaccessを置き、3箇所とも下記のルールでリダイレクトされるよう記述してみました。
・httpsに統一
・wwwなしに統一
・index.htmlとindex.phpにアクセスされたら、それぞれを省略したURLを表示する

しかし、テストしてみたところ、一部成功・一部失敗している状態です。

発生している問題・エラーメッセージ

『ルートディレクトリ』『/wp/ディレクトリ』は希望通りのリダイレクトが成功しているのですが、
『/shop/ディレクトリ』のみ一部条件でリダイレクトに失敗してしまいます。

失敗の条件をまとめると下記のようでした。

  • /shop/index.htmlにアクセスすると、https化・wwwなし化・index省略すべてが失敗する
    (/shop/index.phpへのアクセスは、https化・wwwなし化・index省略すべてが成功する)
  • wwwありの/shop/にアクセスすると、製品紹介サイトhttps://sample.comに飛んでしまう
    (wwwありの/shop/wp-admin/などへのアクセスは、https化・wwwなし化どちらも成功)
    (ただし、/shop/wp-admin/index.phpにアクセスすると、/wp/wp-admin/に飛んでしまう)

該当のソースコード

ルートディレクトリの.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.sample\.com$
RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} index\.(html|php)
RewriteRule ^index\.(html|php)$ / [R=301,L]
RewriteRule ^(.*)/index\.(html|php)$ /$1/ [R=301,L]
</IfModule>


/shop/ディレクトリの.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteOptions Inherit
RewriteBase /shop/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.sample\.com$
RewriteRule ^(.*)$ https://sample.com/shop/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} index\.(html|php)
RewriteRule ^(.*)/index\.(html|php)$ /$1/ [R=301,L]
</IfModule>


参考までに、/wp/ディレクトリの.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.html?$ / [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

試したこと

Rewriteについて検索しながら細々と記述を変えてはテストしているのですが、
時々500エラーを出してしまいつつ、失敗が改善されない状態が続いています。

補足情報

ルートディレクトリの.htaccessには、アクセス制限の記述も入れています。
/wp/ディレクトリの.htaccessには、wordpressのログインURLにアクセスできるIPを制限する記述も入れています。
 
 
長くなりましたが、質問内容は以上となります。
改善策についてアドバイスをいただければ幸いです。
どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • CHERRY

    2019/02/28 12:41

    shop の .htaccess で、 `RewriteOptions Inherit` が設定されているのはなぜでしょうか?

    キャンセル

  • uzushio

    2019/02/28 12:57

    コメントありがとうございます!
    RewriteOptions Inheritは、対処法を検索する中で「親ディレクトリでのURL書き換えを下層ディレクトリに継承するための設定」として見つけ、よくわからないまま効果を期待して入れてみたものの、特に効果は感じられませんでした。まずはこちらを削除するべきでしょうか。

    キャンセル

回答 1

checkベストアンサー

0

ファイルやディレクトリが存在しないときのリライト先は /index.php (絶対パス)ではなく、index.php にすると、RewriteBase を付けて「/shop/index.php」にしてくれます。

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

index.htmlとindex.phpにアクセスされたら、それぞれを省略したURLを表示する

これは、上位ディレクトリの .htaccess と見比べると、1行抜けています。
また、ここではリライト先が「/」から始まるため、RewriteBase を補完できません。
他にも方法があるかもしれませんが、リライト先を /shop/ と直書きするのが簡単です。

RewriteCond %{REQUEST_FILENAME} index\.(html|php)
RewriteRule ^index\.(html|php)$ /shop/ [R=301,L]        ## この行 ##
RewriteRule ^(.*)/index\.(html|php)$ /$1/ [R=301,L]

ただし、index.html はリダイレクトしますが、index.php は最初の RewriteRule で無変換で終了するので、リダイレクトしません。

他、RewriteOptions Inherit は特に必要ないと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/04 13:04

    ご回答ありがとうございます!
    ご指摘いただいた部分を訂正しテストしたところ、
    https化・wwwなし化につきまして希望通りのリダイレクトを確認することができました!
    本当にありがとうございます!

    1点確認させていただきたいのですが、
    ご回答末尾のindex.htmlへのリダイレクトについて解説いただいた内容とは反対に、
    『/shop/index.htmlへアクセス→/shop/index.htmlが表示される(ファイルが無いため404表示)』
    『/shop/index.phpへアクセス→~/shop/のみの、index省略表示がされる(成功)』
    という結果となりました。
    こちらは、index.htmlのほうが無変換で終了しているということでしょうか?
    (html|php)の左右を入れ替えるという安易な方法を試してみましたが、同じ結果でした。
    左右で優先度に変わりはないのですね。

    上記『』内の動きが正常でしたら、まずはこのまま運用していこうと思います。
    https統一とwwwなし統一が叶い、たいへん助かりました。

    また、/shop/wp-admin/index.phpへのアクセスが/wp/wp-admin/に飛んでしまう件は
    解決に至りませんでしたが、サイトの作成に支障はありませんので、
    今後、状況に応じて改めて解決に取り組もうと思います。

    キャンセル

  • 2019/03/04 16:03

    質問文では「RewriteRule ^index\.php$ - [L]」となっていますが、実際には「RewriteRule ^index\.html$ - [L]」となっているのではないでしょうか?

    キャンセル

  • 2019/03/05 10:28

    コメントありがとうございます!
    まず、ご指摘いただいた箇所につきましては、php表記で統一されていました。
    ご指摘のおかげで、/wp/ディレクトリの.htaccessの該当箇所の差異に気づけましたので、他と統一した表記にすることができました。ありがとうございます。

    その後、/shop/ディレクトリの.htaccessへの記述につきましては、試行錯誤の末、なんとか問題点をすべてクリアすることができました。
    『RewriteRule ^(.*)/index\.(html|php)$ /$1/ [R=301,L]』の『/$1/』部分を『https://sample.com/shop/$1』にする、『RewriteCond %{HTTPS} !on』以降を上に移動しRewriteEngine Onをつける、といった方法をとりました。
    最善策ではないかもしれないのですが、保留とした問題点も含め解決できましたので、ご報告させていただきます。

    細かな手直しを助けてくださったTaichiYanagiyaさんには本当に感謝しています。
    お時間をいただき、ありがとうございました!

    キャンセル

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

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