頑張らない!でも諦めない!必死にならずにええかげん

WordPressに作成される.htaccessの動作を改めて確認しておこう

      2015/01/23

WordPressに対してパーマネントリンクを設定すると、
自動的にWordPressのインストールディレクトリに対して、
.htaccessファイルが生成されるのはご存知のことと思います。

ではこの.htaccessファイルはどのような役割を担っているかをチェックしたことはありますか?
ここではパーマネントリンクを設定して作成される
.htaccessファイルによる挙動を確認してみます。

 

自動で作成される.htaccessファイル

パーマネントリンクを設定して作成される.htaccessファイルは、
以下のようになっています。

ここではWordPressを/wp/にインストールしたものを例示しています。

 

さて、この.htaccessファイルはどのようなことをしているのかをより簡単な環境で検証してみます。

ここではApacheのhttpd.conf内にDirectoryIndex指定を行っています。

ディレクトリのアクセスはindex.htmlまたはindex.phpへの要求とみなされます。

 

プロモーション(btm)

Google or AdMax Promotion (it)

概略

以下を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の後にもコメントを追加します。

01_WordPress自動作成.htaccessの編集

WordPress自動作成.htaccessの編集

 

WordPressのパーマネントリンク設定を更新します。

02_WordPressパーマネントリンクの設定更新

WordPressパーマネントリンクの設定更新

 

.htaccessファイルを確認すると「# BEGIN WordPress~# END WordPress」間は、
元の設定が復旧され上書きされています。
# END WordPressの後のコメントはそのまま残ります。

03_.htaccessの自動更新と上書き

.htaccessの自動更新と上書き

ご参考まで。

 

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]とすることができます。

04_wp-adminをスラッグ指定

wp-adminをスラッグ指定

 

しかしディレクトリが存在する限りは、
WordPressによってページが表示されることはありません。

実在するディレクトリ(ここはwp-admin)が優先され、
単にダッシュボードが表示されるだけになります。投稿した固定ページを表示することはできません。

05_URLに指定してもダッシュボード表示

URLに指定してもダッシュボード表示

 

存在しないURLの場合はWordPressが処理

通常はサーバー上に実在しないURLにて投稿や固定ページを公開した場合に、
WordPressに対してコンテンツの表示を任せて、
URLに合ったコンテンツの表示が行われます。

http://hta.rensrv.com/wp/2014/08/hello-world/

06_投稿URLと表示

投稿URLと表示

 

また、ディレクトリとしても存在せず、WordPressも提供するコンテンツがないような、
URLを指定した場合(http://hta.rensrv.com/wp/not-exist/ )などには、
WordPressが404ページを表示します。

07_存在しないURLの指定とWordPress404表示

存在しないURLの指定とWordPress404表示

 

存在するファイルにはアクセスが可能

こうした存在するファイルやディレクトリでは実ファイルが表示されるという仕組みから、
実際には何も表示されることはありませんが、

URLに対して、以下のようなURLを指定することもできます。

http://hta.rensrv.com/wp_hta/wp-settings.php と設定ファイルを指定した場合も、
アクセス権が付与されている以上、ページの表示ができてしまいます。

wp-settings.phpを直接指定するとPHPのエラーレポートレベル(サーバーの設定)によっては、
以下のようにエラーメッセージが表示されてしまう事と思います。

08_エラー表示とファイルパスの漏えい

エラー表示とファイルパスの漏えい

 

PHPのエラー表示を行わないように設定を変更しておくことで、
空白ページの表示に改善を行うことができます。

09_空白ページとしてのURLアクセス

空白ページとしてのURLアクセス

 

一般的に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ファイル一つとってもちゃんと何をしているのかを見ておくのは大切だと思います。

当サイトですか?
こうしたことを考える間もなくサイトを公開してしまって、
その後設定変更をする余裕も勇気もなく、そのまま・・・。

ちゃんとしないとね。

 


*本ページ内に記載されされた各社ブランド、サービス名、商標、登録商標については、
各社ブランドのロゴや商標等に関する帰属についてをご確認ください


最後までお読みいただきありがとうございました。

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。

AdMax Promotion

ブログ記事のご紹介
すべて展開 | すべて省略

Rakuten Promotion

ページ
すべて展開 | すべて省略

 - WordPress

  関連記事

eye_wordpress
Welcart e-Commerce_v1.3.15プラグインの必須初期設定

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_vaultpress
VaultPress™を利用して運用中のメインサイト(Primary)を復旧する手順

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
印刷をJetpack by WordPress.comで行う動作

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
wordpressの投稿で「続きを読む(read more)」を表示する方法

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPressのサイドバーにGoogle™サイト内検索(カスタム検索エンジンv2)を設置する方法

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
GoogleAdSense導入サイトではZenbackの利用は難しそうだ

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
投稿の前後挿入にNew Adman_v1.6.8-wordpressプラグインを利用

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
ウィジェットでのPHP実行にPHP Code Widget_v2.2-wordpressプラグインを利用

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
17.ウィジェット表示管理-Jetpack by WordPress.com

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
18.タイルギャラリー-Jetpack by WordPress.com

Google or AdMax Promotion(it) 禁断の機能がau公式 …