WordPressに作成される.htaccessの動作を改めて確認しておこう
2015/01/23
WordPressに対してパーマネントリンクを設定すると、
自動的にWordPressのインストールディレクトリに対して、
.htaccessファイルが生成されるのはご存知のことと思います。
ではこの.htaccessファイルはどのような役割を担っているかをチェックしたことはありますか?
ここではパーマネントリンクを設定して作成される
.htaccessファイルによる挙動を確認してみます。
自動で作成される.htaccessファイル
パーマネントリンクを設定して作成される.htaccessファイルは、
以下のようになっています。
ここではWordPressを/wp/にインストールしたものを例示しています。
1 2 3 4 5 6 7 8 9 10 |
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /wp/index.php [L] </IfModule> # END WordPress |
さて、この.htaccessファイルはどのようなことをしているのかをより簡単な環境で検証してみます。
ここではApacheのhttpd.conf内にDirectoryIndex指定を行っています。
ディレクトリのアクセスはindex.htmlまたはindex.phpへの要求とみなされます。
1 2 3 |
<IfModule dir_module> DirectoryIndex index.html index.php </IfModule> |
概略
以下を1行ずつ見ていきます。L1などの記号は各行を表しています。
L1 # BEGIN WordPress
L2 <IfModule mod_rewrite.c>
L3 RewriteEngine On
L4 RewriteBase /wp/
L5 RewriteRule ^index\.php$ - [L]
L6 RewriteCond %{REQUEST_FILENAME} !-f
L7 RewriteCond %{REQUEST_FILENAME} !-d
L8 RewriteRule . /wp/index.php [L]
L9 </IfModule>
L10
L11 # END WordPress
L1、L11のコメント行
1行目と11行目は単なるコメントですが、WordPressによって制御される領域です。
「# BEGIN WordPress~# END WordPress」の間は、
WordPressの設定変更によって書き換えられる場合があります。
その為、別の設定を記載するに当たってはこのコメント外に記述するといいでしょう。
試しに、L1~L11までをすべて削除した状態でパーマネントリンクの設定を更新すると、
内容が復旧されるのが分かります。
.htaccessファイルの「# BEGIN WordPress~# END WordPress」間を削除しコメントを挿入します。
また# END WordPressの後にもコメントを追加します。
WordPressのパーマネントリンク設定を更新します。
.htaccessファイルを確認すると「# BEGIN WordPress~# END WordPress」間は、
元の設定が復旧され上書きされています。
# END WordPressの後のコメントはそのまま残ります。
ご参考まで。
L2、L9のモジュール指定行
L2、L9の対象モジュール指定の行「<IfModule mod_rewrite.c>~</IfModule>」は、
「mod_rewrite.c」が処理を行う際のみに内部の設定が影響します。
その他のモジュールではこの部分は考慮されません。
URLの置換においてはmod_rewriteが利用されます。
L3置換の有効化指定行
「RewriteEngine On」を指定することによって、
以下に記述する置換を有効化することができます。
置換を行う場合にはRewriteEngine Onを記述します。
L4、L8の置換条件指定
L4~L8にて置換の条件指定を記述しています。
この RewriteBase の指定って意味あるの?という体験をされたことがあるかもしれません。
WordPressが生成してくる.htaccessには、
RewriteRule側でディレクトリを明示している為に、
RewriteBase の指定が適用されていないのがほとんどです。
RewriteBaseの指定方法とその挙動の違いについては以下で検証しています。
L4の「RewriteBase /wp/」を指定していることで、
置換後のディレクトリにはベースに指定した「/wp/」が適用されます。
その為、L8に指定している「RewriteRule . /wp/index.php [L] 」行の
「/wp/」部分は本来省略が可能なのです。
「RewriteRule . index.php [L] 」と記述した場合でも、
RewriteBase /wp/の設定でディレクトリが補完され、 /wp/index.phpの内容が返されます。
L5の中断処理指定
L5行目の「RewriteRule ^index\.php$ – [L] 」では、
置換条件が記載されていますが、置換ルールの部分が「-」となっています。
また最後に[L]が記載されています。
LはLastでこの条件に一致した場合、以後処理しないという終了を意味します。
この場合、条件に一致した場合は置換処理せず(-)、終了とする([L])ということになります。
しかしながら、この.htaccessファイル自体が、
WordPressインストールディレクトリ内(/wdps/)に配置されていますので、
この場合要求されたファイルは「/wp/~」になります。
その為、この条件「^index\.php$」は、
[行の開始(^)]index.php[行の終了($)] の意味になりますので、
WordPressインストールディレクトリに配置された.htaccessファイルでは、
すべて「/wp/~」と行の開始がディレクトリが含まれてきます。
その為、この条件にマッチして処理されることはないと言えます。
この条件にマッチするのはドキュメントルートに対してWordPressをインストールした場合だけです。
ドキュメントルートに対してWordPressをインストールした場合には、
URLの置換の必要がなくなるために、この中断処理があると言えます。
ただ、あえてURLに対してindex.phpを指定してアクセスすることも少ないので、
実際には保険的な意味合いが強いと考えられます。
L6,L7のディレクトリ・ファイル存在確認
L6行目「RewriteCond %{REQUEST_FILENAME} !-f 」と、
L7行目「RewriteCond %{REQUEST_FILENAME} !-d」に関しては、
置換条件を指定しています。
尚、この条件の判定が行われるのは上記のL5行目の判定に当たらなかった場合です。
L6行目では、
リクエスト(%{REQUEST_FILENAME})のファイルが(!-f)が存在しない(!-f)場合としています。
L7行目では、
リクエスト(%{REQUEST_FILENAME})のディレクトリが(!-d)が存在しない(!-d)場合としています。
このことによって、URLによって指定されたファイルまたはディレクトリが、
存在する場合には、L8行目の置換が行われません。
WordPressディレクトリ内のファイルも同様
このことはWordPressのインストールディレクトリ内にも言えることで、
WordPressのディレクトリ構造は一般的に知られていますが、
この内部に存在している実ファイルをURL指定した際には、
WordPressの置換条件から除外されることで、実際のファイルを確認することができます。
例えば、以下のようなURLを指定した場合です。
http://hta.rensrv.com/wp/readme.html
このreadme.htmlファイルはWordPressをインストールすると、
初期状態でインストールされています。
※ここでのWordPressのインストールディレクトリは「wp」です。
WordPressの.htaccessが担っているのは、
こうした実際にファイルやディレクトリが存在しない場合には、
WordPressがindex.phpを介して、コンテンツを提供しているだけなのです。
WordPressディレクトリ内のファイルも同様
では、感度のいい方は次のような疑問を感じるかもしれません。
実在するディレクトリ名を固定ページなどのパーマネントリンク(URL)に指定した場合は?
これは単純なことでL6,L7でファイルとディレクトリの存在確認があり、
存在しない場合のみにWordPressの投稿や固定ページのURLとしてアクセスができます。
その為、実際に実在するディレクトリなどで固定ページを作成し公開することはできます。
何か制約が掛かっているわけではありません。
実際に固定ページのスラッグを[wp-admin]とすることができます。
しかしディレクトリが存在する限りは、
WordPressによってページが表示されることはありません。
実在するディレクトリ(ここはwp-admin)が優先され、
単にダッシュボードが表示されるだけになります。投稿した固定ページを表示することはできません。
存在しないURLの場合はWordPressが処理
通常はサーバー上に実在しないURLにて投稿や固定ページを公開した場合に、
WordPressに対してコンテンツの表示を任せて、
URLに合ったコンテンツの表示が行われます。
http://hta.rensrv.com/wp/2014/08/hello-world/
また、ディレクトリとしても存在せず、WordPressも提供するコンテンツがないような、
URLを指定した場合(http://hta.rensrv.com/wp/not-exist/ )などには、
WordPressが404ページを表示します。
存在するファイルにはアクセスが可能
こうした存在するファイルやディレクトリでは実ファイルが表示されるという仕組みから、
実際には何も表示されることはありませんが、
URLに対して、以下のようなURLを指定することもできます。
http://hta.rensrv.com/wp_hta/wp-settings.php と設定ファイルを指定した場合も、
アクセス権が付与されている以上、ページの表示ができてしまいます。
wp-settings.phpを直接指定するとPHPのエラーレポートレベル(サーバーの設定)によっては、
以下のようにエラーメッセージが表示されてしまう事と思います。
PHPのエラー表示を行わないように設定を変更しておくことで、
空白ページの表示に改善を行うことができます。
一般的にWordPressはphpファイルのアクセス権の設定は600で動作します。(セーフモードを除く)
600にしたからと言ってもページの表示ができてしまうことには変わりはありませんが、
無用なアクセス権の付与はしないように変更しておく方がいいでしょう。
念のためphpファイルのアクセス権はすべて600に変更してしまうこともご検討下さい。
※要バックアップの上、変更してください。
L8の置換条件とパターン
L8行目に記載されている「 RewriteRule . /wp/index.php [L] 」部分が、
実際の置換条件と置換パターンです。
L6,L7に指定した条件が満たされた場合のみ、ここに指定した条件で置換が実行されます。
この場合、「.」が置換の条件で「すべて」が指定されています。
置換パターンとして「/wp/index.php」が指定されていますので、
すべてのURLの指定が「/wp/index.php」に置換されます。
あとは、WordPress側で実際のパーマネントリンクの指定に基づいて、
各投稿のURLなどに再度置き換えられてページが表示されています。
WordPressの表示では常にこのインストールディレクトリに配置されているindex.phpが、
ページの表示すべてを担ってページの表示を行っているというわけです。
さいごに
改めてWordPressが自動で作成してくる.htaccessファイルを、
実際に見ていくとWordPress内のファイルに対して、
どのようにアクセス権を指定しておかなければいけないのかの目安になります。
なんとなく使ってしまいがちのWordPressですが、
.htaccessファイル一つとってもちゃんと何をしているのかを見ておくのは大切だと思います。
当サイトですか?
こうしたことを考える間もなくサイトを公開してしまって、
その後設定変更をする余裕も勇気もなく、そのまま・・・。
ちゃんとしないとね。
WordPressはWordPress Foundation の登録商標(第5049965号)です。
WordPressロゴ、アイコンその他のマーク等はWordPress Foundation の商標であり、
WordPress Foundation の著作物です。
WordPress.comはWordPress Foundation が管理運営を行うドメインならびにサービスの名称です。
WordPress.com、WordPress.net、WordPress.org、WordPress.tv、
WordPressFoundation.orgはWordPress Foundationが
管理運営を行なう正式なトップレベルドメインであるとともに、
WordPress Foundationが運営を行うサービスの名称です。
wordpressはFree Software Foundation, Inc.によってGPL2+でライセンスされています。
関連記事
-
Welcart e-Commerce_v1.3.15プラグインの必須初期設定
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
VaultPress™を利用して運用中のメインサイト(Primary)を復旧する手順
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
印刷をJetpack by WordPress.comで行う動作
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
wordpressの投稿で「続きを読む(read more)」を表示する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
WordPressのサイドバーにGoogle™サイト内検索(カスタム検索エンジンv2)を設置する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
GoogleAdSense導入サイトではZenbackの利用は難しそうだ
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
投稿の前後挿入にNew Adman_v1.6.8-wordpressプラグインを利用
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ウィジェットでのPHP実行にPHP Code Widget_v2.2-wordpressプラグインを利用
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
17.ウィジェット表示管理-Jetpack by WordPress.com
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
18.タイルギャラリー-Jetpack by WordPress.com
Google or AdMax Promotion(it) 禁断の機能がau公式 …