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

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

新規登録して質問してみよう
ただいま回答率
85.42%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

.htaccess

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

Q&A

解決済

1回答

12934閲覧

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

uzushio

総合スコア17

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

.htaccess

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

0グッド

0クリップ

投稿2019/02/28 02:29

前提・実現したいこと

『製品紹介サイト』と『製品販売サイト』を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/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を制限する記述も入れています。


長くなりましたが、質問内容は以上となります。
改善策についてアドバイスをいただければ幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

CHERRY

2019/02/28 03:41

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

2019/02/28 03:57

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

回答1

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/01 15:24

TaichiYanagiya

総合スコア12161

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

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

uzushio

2019/03/04 04: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/に飛んでしまう件は 解決に至りませんでしたが、サイトの作成に支障はありませんので、 今後、状況に応じて改めて解決に取り組もうと思います。
TaichiYanagiya

2019/03/04 07:03

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

2019/03/05 01: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さんには本当に感謝しています。 お時間をいただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問