こんにちは、エムケーワイです。
先日とあるサイトを運営している方から、ブラウザで入力したURLが勝手に変換されページが表示されないと相談を受けました。具体的には下記のような感じです。サイト名を”sample.com”とすると、
入力 | 結果 |
sample.com | sample.com (問題なし) |
sample.com/en | sample.com/en/en |
sample.com/en/ | sample.com/en//en/ |
ちなみに当該サイトはWordPressで作成されており、プラグインPolylangを使って二ヶ国語化(日本語および英語)されています。”sample.com”は日本語のトップページ、”sample.com/en/”は英語のトップページです。
URLの末尾にサブディレクトリ部分がコピーされて2回繰り返される形になり、そのようなページは存在しないので404エラーが発生します。
URLの末尾にサブディレクトリ部分がコピーされる原因は分からなかったのですが、問題は解決できたので、今回私がやったことの備忘録を残します。
1. 症状確認
1-1. ブラウザにURLを入力しての確認
まずブラウザにURLを直接入力しての症状確認を行いました。相談者から連絡のあった英語版トップページで症状が発生する事を確認しましたが、英語版に限らずトップページ以下のページでも症状が発生することを確認しました。下記のような感じです。
入力 | 結果 |
sample.com/support | sample.com/support/support |
sample.com/support/ | sample.com/support//support/ |
sample.com/en/support | sample.com/en/support/en/support |
sample.com/en/support/ | sample.com/en/support//en/support/ |
日本語ページでも発生するので、Polylangが悪さをしているわけではないようです。
また、URLを”https://”で始めると症状が発生せず、”http://”で始めた場合は症状が発生することも分かりました。
1-2. リダイレクトチェッカーでの確認
何らかのリダイレクト処理が行われているようなので、下記のサイトのリダイレクトチェッカーでリダイレクト処理の確認を行いました。
①での確認結果です。
URLの末尾に”/”がないケースです。入力したURL”http://xxxxx.com/en”から”https://xxxxx.com/en/en”に301リダイレクトされています。”https://xxxxx.com/en/en”へのリクエストのステータスは404(Page not found)となっています。
続いて②での確認結果です。
こちらはURLの末尾に”/”があるケースです。入力したURL”http://xxxxx.com/en/”から”https://xxxxx.com/en//en/”に301リダイレクトされています。結果は「アクセスはできませんでした。」となっています。
どちらもプロトコルを”http”から”https”に変換するリダイレクトが行われ、その際URLのサブディレクトリ部分が末尾に追加されています。
2. .htaccessファイルの内容確認
ここまでの確認で、”http”から”https”への301リダイレクトが行われていることが確認できました。相談者は、第三者がWordPressの管理画面やサーバーにログインして作業することを望まれなかったので、.htaccessファイルを送付してもらって内容を確認することにしました。
.htaccessファイルには、さくらインターネットサーバー、プラグインSiteGuard WP、WordPressによる設定はありましたが、それ以外にリダイレクトに関する設定はありませんでした。
相談者はプログラミングはできないということですし、リダイレクトを行うプラグインもインストールされていないようだったので、PHPやJavaScriptでのリダイレクトが設定されている可能性もなさそうです。
結局何があの奇妙なリダイレクト処理を行っているのか突き止めることはできませんでした。
3. .htaccessファイルの修正と修正後の動作確認
3-1. .htaccessファイルの修正
リダイレクトの原因は分かりませんでしたが、何らかの対策が必要なので、.htaccessファイルにあえて”http”で始まるURLを”https”で始まるURLに301リダイレクトするコードを明記することにしました。どこかでリダイレクトの設定がされていても、.htaccessファイルでの設定が優先されるだろうと考えたわけです。
具体的には、WordPressによる設定の前に下記のコードを追記しました(ここでは下記コードの説明は省略します)。
# BEGIN http --> https
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END http --> https
3-2. 修正後の動作確認
相談者にオリジナルの.htaccessファイルを、上記のコードを追加した.htaccessファイルに置き替えてもらい動作確認を行いました。
結果、末尾にサブディレクトリ部分が追加される症状は発生しなくなり、URLに”sample.com/en”と入力しても、”sample.com/en/”と入力しても、ちゃんと英語版トップページが表示されるようになりました。トップページ以外に関しても問題ありませんでした。
①(ABASHI Web Tools)のリダイレクトチェッカーで確認した結果は下図の通りです。
“http://xxxxx.com/en/”からきちんと”https://xxxxx.com/en/”に301リダイレクトされています。また、”https://xxxxx.com/en/”へのリクエストはステータスが200で、リクエスト成功を示しています。
とりあえず、.htaccessファイルに”http”で始まるURLを”https”で始まるURLに301リダイレクトするコードを明記することで、URLの末尾にディレクトリ部分がコピーされる症状は解消しました。
4. リダイレクトの確認補足
今回リダイレクトの確認を主にリダイレクトチェッカーで行いましたが、ブラウザの開発者ツールでも行うことができます。具体的には、「ネットワーク」タブを開いてページをロードするとリクエストのログが表示されます。
入力URLを”xxxxx.com/en”とした場合、最初の3つのリクエストでリダイレクト処理が行われていることが分かります。
< 1回目のリクエスト >
“http”で始まるURLから”https”で始まるURLへの301リダイレクトが行われています。
< 2回目のリクエスト >
URLの末尾に”/”が追加される301リダイレクトが行われています。
< 3回目のリクエスト >
URL”https://xxxxx.com/en/”へのリクエストが成功しています(Status Codeが200)。
5. まとめ
URLの末尾にサブディレクトリ部分がコピーされる奇妙なリダイレクトの対策として行ったことをまとめました。
.htaccessファイルの内容を確認したものの、リダイレクトに関係するコードは見当たらず、症状の原因は分かりませんでした。しかし、.htaccessファイルに”http”で始まるURLを”https”で始まるURLに301リダイレクトするコードを明記することで、とりあえず症状が発生しなくなりました。
もし、今回の症状の原因や対策をご存じの方がいらっしゃったら、教えていただけると幸いです。
最後までお読みいただきありがとうございました。