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

.htaccessのRewriteBase動作を改めて確認してみました

      2014/11/22

WordPressに限らず何かしらのWebコンテンツを公開していれば、
一度は目にしたことのある.htaccessファイルですが、
じっくりと動作を確認したことはありますか?
どこのサイトを見てもRewriteBaseに関しての細かな解説が書かれておらず、
ずっともやっとした状態で過ごしていましたが、
RewriteBaseの挙動を実例を交えてご紹介します。

 

RewriteBaseに触れる機会

RewriteBaseというとWordPressなどでパーマネントリンクを設定した際に、
自動的に作成されてくる.htaccessファイルに対して設定されているアレです。

 

この4行目の「 RewriteBase /wp/ 」と8行目の「 RewriteRule . /wp/index.php [L] 」
いつも重複して設定されてくるので、 実際はいらないんじゃないかな・・・
そんな風に思っているわけですが、

RewriteBaseの設定が効いてるのか、効いてないのか、、、。
何の為にこういう設定が入っているのかが疑問だったりするわけです。

というわけで、いろいろなパターンでRewriteBaseの設定と挙動を確認しました。

 

プロモーション(btm)

Google or AdMax Promotion (it)

RewriteBaseの設定とその動作

そもそもRewriteBaseとは?

RewriteBase Directive | mod_rewrite – Apache HTTP Server Version 2.4 (抜粋引用) The RewriteBase directive specifies the URL prefix to be used for per-directory (htaccess) RewriteRule directives that substitute a relative path. This directive is required when you use a relative path in a substitution in per-directory (htaccess) context unless either of the following conditions are true:

    • The original request, and the substitution, are underneath the DocumentRoot (as opposed to reachable by other means, such as Alias).

 

    • The filesystem path to the directory containing the RewriteRule, suffixed by the relative substitution is also valid as a URL path on the server (this is rare).

 

In the example below, RewriteBase is necessary to avoid rewriting to http://example.com/opt/myapp-1.2.3/welcome.html since the resource was not relative to the document root. This misconfiguration would normally cause the server to look for an “opt” directory under the document root.

 

(以下、Google翻訳)
RewriteBaseディレクティブは、相対パスに置き換えてディレクトリ単位(htaccessを)のRewriteRuleディレクティブに使用するURL接頭辞を指定します。

以下の条件のいずれかに該当する場合を除きあなたはディレクトリ毎(htaccessの)コンテキストで置換を相対パスを使用する場合にこのディレクティブが必要です。

  • (例えばエイリアスのような他の手段によって到達可能ではなく)元の要求、および置換は、DocumentRootの下にある。
  • 相対的置換によって接尾辞のRewriteRuleを含むディレクトリへのファイルシステムのパスも(これは稀である)サーバー上のURLパスとして有効です。

以下の例では、RewriteBaseは、リソースがドキュメントルートからの相対ではありませんでしたので、http://example.com/opt/myapp-1.2.3/welcome.html に書き換えないようにする必要がある。この設定ミスは通常、サーバはドキュメントルートの下に “opt”ディレクトリを探すように原因となる。

とまぁ、分かるようなわからないような・・・。
となると、まぁ設定した場合の動作を確認しようとなるわけです。

RewriteBaseの各設定と動作

基本はWordPressが作成してくる.htaccessファイルをベースとして、
RewriteBaseの部分をそれぞれ変更することによって、
どのように動作が変わり、結果どこのindex.phpを返すのかを確認していきます。

 

以下の.htaccessの例はWordPressをベースにしている為、
要求するURLのファイル・ディレクトリが存在しないことが置換条件です。
その為、検証先URLの後ろに「/1/」を付けて、ディレクトリとして存在しないURLを指定しています。

RewriteBase=RewriteRule一致指定

WordPressが標準で作成してくる.htaccessがこの形式です。
これを基本パターンとして検証します。

この場合、RewriteBaseには、/rewrite_base/ が指定され、 RewriteRuleにも、/rewrite_base/index.php が指定されています。 では、実際にアクセスするとどうなるでしょうか。

http://hta.rensrv.com/rewrite_base/obvious/1/ 現在表示しているファイル: …/rewrite_base/index.php
 

正しく、/rewrite_base/index.phpが表示されます。

補足

ちなみにこうした指定は内部ディレクトリから上位ディレクトリの指定だけでなく、 外部ディレクトリからも同じように指定できます。

この例では、「/base_check/.htaccess」にて、
RewriteBaseには、/rewrite_base/ が指定され、
RewriteRuleにも、/rewrite_base/index.php が指定されています。

http://hta.rensrv.com/base_check/1/

現在表示しているファイル: …/rewrite_base/index.php

そうした指定でもリライトは当然可能です。

RewriteBaseのみRewriteRuleファイル指定

では、RewriteBaseの設定を残して、RewriteRuleに対してファイル名のみを指定した場合です。

この場合、RewriteBaseには、/rewrite_base/ が指定され、 RewriteRuleには、index.php のみが指定されています。 では、実際にアクセスするとどうなるでしょうか。

http://hta.rensrv.com/rewrite_base/notobvious/1/ 現在表示しているファイル: …/rewrite_base/index.php
 

同じく、/rewrite_base/index.phpが表示されます。 RewriteBaseの設定が効いています。

RewriteBase≠RewriteRule不一致指定

では、RewriteBase設定と、RewriteRuleの指定が異なっている場合です。

この場合、RewriteBaseには「 /rewrite_base/」が指定され、
RewriteRule には「 /other_base/index.php 」が指定されています。

なんとなく 「/rewrite_base/other_base/index.php」が表示されそうな気がしませんか?
では、実際にアクセスするとどうなるでしょうか。

http://hta.rensrv.com/rewrite_base/obvious_over/1/

現在表示しているファイル: …/other_base/index.php

結果的に表示されたのは、/other_base/内のindex.phpです。
RewriteBaseの指定は全く利用されません。

要はRewriteRuleに対して明示してある場合は、そちらを採用するという挙動です。

 

RewriteRuleに/index.phpを指定

では、RewriteRuleのパターン指定の部分に対して、「/index.php」と指定した場合はどうでしょう。

これまで、RewriteRuleにはファイル名を指定した場合にはRewriteBaseが有効に動作し、
ディレクトリを指定した場合には、RewriteRuleのみが採用されました。

この場合もその挙動と同じです。

http://hta.rensrv.com/rewrite_base/slash/1/

現在表示しているファイル: …/index.php

ルートのindex.phpが要求され表示されます。

 

さいごに

このように RewriteBaseの指定は必須と言うわけではありませんし、
RewriteRule側の指定で正しく設定されていれば、十分に機能します。

mod_rewriteのヘルプに記載された例では、

以下の条件のいずれかに該当する場合を除き・・・このディレクティブが必要です。

(例えばエイリアスのような他の手段によって到達可能ではなく)元の要求、および置換は、DocumentRootの下にある。

と言うことですので、元の要求も置換結果も両方がそもそもDocumentRootの下にある場合は、
無理に利用する必要はないというのが結論かと思います。

通常のサイト表示を行っている範囲では、
RewriteBaseの指定は特に必要なくRewriteRule側の指定で事足りるでしょう。

ただ、RewriteBaseの指定があっても弊害があるわけではないようなので、
WordPressのパーマネントリンク指定によって
生成される.htaccessのRewriteBaseの設定はそのままでも問題なさそうです。

 

尚、RewriteBaseに対して外部のドメインなどを設定しても、
「Internal Server Error」が発生しますので利用はできません。

 


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


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

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

AdMax Promotion

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

Rakuten Promotion

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

 - WordPress

  関連記事

eye_gravatar
Gravatar™プロフィールウィジェットをJetpackを利用して表示する

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

eye_google_anl
GoogleAnalyticsのユニバーサルアナリティクスコードを取得する(追加)

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

eye_local_apache
ローカル環境へのApache設置

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

eye_wordpress
22.Beautiful Math-Jetpack by WordPress.com

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

eye_php
ファイルアップロード上限の変更(PHP phpMyAdmin wordpress)

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

eye_google_pls
Google+™への共有をJetpack by WordPress.comで行う動作

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

eye_wordpress
ヘッダー・フッターバー表示にはHeader and Footer Commander-wordpressプラグインを利用

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

eye_wordpress
wordpressサイトにさりげなく表示されたスマイルマーク(^-^)は何か

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

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

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

eye_wordpress
投稿の前後挿入にPostPost-wordpressプラグインを利用が(配布されなくなっていた)

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