ワードプレスをサブディレクトリにいれ、URLを変更する

Webサイト制作

まずロリポップでサブディレクトリを作り、そこにワードプレス簡単インストールでワードプレスとデータベースを作成しておきます。このときサイトURLはhttps://example.com/wpのように、サブディレクトリを含んでしまっているので、これをhttps://example.comのみになるよう変更します。

1ワードプレス管理画面でURLを変更する

●wordpressアドレスはwordpressコアファイル等がインストールされてるフォルダへのアドレスです。違うアドレスを入れてしまうとエラーが出て管理画面にもアクセスできなくなります。修正方法はデータベースのデータを書き換える等で解決できます。

●サイトアドレスは表示させたいURLを入れてください

修正時注意することは、データベースでwp_optionsテーブルでは
option_name
siteurl がワードプレスアドレスで、
homeがサイトURLとなります。
逆だと思ってた。

2 index.phpや.htaccessファイルを修正する

まずインストールされてるwordpressのファイル群の中にindex.phpと.htaccessのファイルがあるのでそれらを複製します。

index.phpを修正

サブドメイン(元もとあったファイル)でのindex.php

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';

これを複製して最後の行を変更し、ドメイン直下や、変更したいURLの最後のディレクトリ内にアップロードします。(以下は変更する箇所、サブディレクトリがwpだとした場合)

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp/wp-blog-header.php';

requireはPHPの構文で、指定したファイルを読み込んで実行します。

__DIR__はPHPのマジック定数で、現在のスクリプトが存在するディレクトリのパスを返します。

つまり今のディレクトリからサブディレクトリ以下をドットで連結して、ちゃんとwp-blog-header.phpを呼び出せるようになっています。ちなみに_DIR_で返されるパスはスラッシュが最後についてないので、/wp など/を忘れるとうまく動作しません。

.htaccessを修正

サブドメイン(元あったファイル)での.htaccess

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

# END WordPress

これを複製し、以下のように書き換えてドメイン直下や、変更したいURLの最後のディレクトリ内にアップロードします。(変更する箇所は二行、サブディレクトリがwpだとした場合、それを削除)

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

これらはApacheの設定言語(もしくはディレクティブ)で、Apacheへ設定しています。

<IfModule mod_rewrite.c>・・・、mod_rewriteモジュールが有効である場合にのみ、以下のルールを適用することを示しています。mod_rewriteが無効なサーバーでは、これらのルールは無視されます。

RewriteEngine On・・・mod_rewriteエンジンを有効にします。

RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]・・・どのリクエストに対しても適用され、環境変数HTTP_AUTHORIZATIONを設定します。これにより、HTTP認証情報がリクエストから削除されずに保持されます。ログイン認証や、その他さまざまなプラグイン、テーマ設定により認証が必要な場合、リダイレクトされてもその認証情報を保持するらしい。

RewriteBase /wp/・・・相対パスの基準点を設定します。/wp/を基準点として、それ以降の書き換えルールの対象パスが相対的に解釈されます。(ただの相対パスなので絶対パスを記述するときはいらないらしいし、これが書いてあっても/wp/からパスを書き始めたりしていて、自分には意味があるんだかよくわからない)

RewriteRule ^index.php$ – [L]・・・index.phpというファイル名がリクエストされた場合、そのリクエストをそのまま処理し、以降の書き換えルールを適用しないことを指示しています。[L]はこのルールが最後であることを示します(ここで書き換えを終了)。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
・・・この条件は、リクエストされたディレクトリが実際には存在しない場合にのみ次の書き換えルールを適用することを示しています。

RewriteRule . /wpsub/index.php [L]・・・上記の条件が満たされた場合、つまりリクエストされたファイルやディレクトリが存在しない場合、リクエストを/wp/index.phpにリダイレクトします。[L]はこのルールが最後であることを示します(ここで書き換えを終了)。

自分の解釈なんで間違ってるかもしれないんですが、とにかくどんなリクエストが来てもindex.phpにアクセスさせてやるし、さらにindex.phpではドメイン直下だろうがサブディレクトリだろうがwp-blog-header.phpを実行すると言ってて、そこでURLを解析して、ワードプレスが出すページを判定しているということになるっぽいです。だからワードプレスでサイトURLと実際ファイルがあるURLを設定しているのも、おそらくその解析に使われているのだと思われます。

ポイント

①とにかくindex.phpにつなげたい(.htaccessがやりたいこと)
②そして最終的にwp-blog-header.phpを呼びたい(index.phpがやりたいこと)
③ワードプレスにどのURLで表示させたいのか設定するのが大事(解析してページを出しわけるため)


ロリポップのマニュアルではサブドメイン下のindex.phpは削除しろと言われています。削除してもしなくてもどちらでもうまく機能していたのですが、多くの記事でサブドメイン下のindex.phpも必要だと言っていますね。構造的にわかりやすいし何かあったときに設定が追記しやすいかなと思って一応どっちも残しました。あとサイトURLとワードプレスアドレスを違う設定にするとサイトURL直下に.htaccessが勝手に作られているので実はやることはindex.phpを書き換えるだけです。