.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の設定と挙動を確認しました。
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 asAlias
).
- 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.
1234567 DocumentRoot /var/www/example.comAlias /myapp /opt/myapp-1.2.3<Directory /opt/myapp-1.2.3>RewriteEngine OnRewriteBase /myapp/RewriteRule ^index\.html$ welcome.html</Directory>
(以下、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」が発生しますので利用はできません。
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+でライセンスされています。
関連記事
-
Gravatar™プロフィールウィジェットをJetpackを利用して表示する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
GoogleAnalyticsのユニバーサルアナリティクスコードを取得する(追加)
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ローカル環境へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
22.Beautiful Math-Jetpack by WordPress.com
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ファイルアップロード上限の変更(PHP phpMyAdmin wordpress)
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
Google+™への共有をJetpack by WordPress.comで行う動作
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ヘッダー・フッターバー表示にはHeader and Footer Commander-wordpressプラグインを利用
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
wordpressサイトにさりげなく表示されたスマイルマーク(^-^)は何か
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
WordPressのサイドバーにGoogle™サイト内検索(カスタム検索エンジンv2)を設置する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
投稿の前後挿入にPostPost-wordpressプラグインを利用が(配布されなくなっていた)
Google or AdMax Promotion(it) 禁断の機能がau公式 …