サポート » 使い方全般 » 同じディレクトリにindex.phpとindex.htmlを混在させる

  • さくらサーバーでtestというディレクトリでWordpressを使っています。
    事情があって、同じtestというディレクトリにindex.htmlを置くことになりました。
    Wordpressが自動的に作った .htaccess ファイルがあります。

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /test/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /test/index.php [L]
    </IfModule>
    # END WordPress

    これが原因なのか、test/index.phpにアクセスするとtest/index.htmlが表示されてしまいます。
    どなたかヒントをいただければ幸いです。

    またwordpress内のHomeへのリンクをhttp://***/test/ではなく強制的にhttp://***/test/index.phpにすることは出来るのでしょうか?

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • モデレーター jim912

    (@jim912)

    officegilbertoさん、こんにちは。

    test/index.phpにアクセスしても、WordPressがtest/へリダイレクトさせるため、index.htmlが表示されてしまうことになります。

    index.htmlがディレクトリ名でなく、ファイル名付きのアクセスで良ければ、.htaccessに

    DirectoryIndex index.php index.html index.cgi

    を追加すれば、上記のリダイレクトによる問題は回避できます。

    HOMEへのリンクの改変は、影響する範囲が広範囲にわたるため、現実的には無理だと思われます。

    トピック投稿者 officegilberto

    (@officegilberto)

    jim912さん ありがとうございます。

    DirectoryIndex index.php index.html index.cgi

    ですと index.php が優先になってしまうんですよね。
    複数の静的なhtmlでサイトが出来ていて同じディレクトリ内にWordpress2.7がインストールされている状態です。優先順位はあくまでindex.htmlになります。

    以前は http://***/test/index.php でも表示が出来ていたのですが 2.7 にアップデートしたらリダイレクトされるようになってしまいました。

    別のディレクトリにWPを作り直したほうが良さそうですね。

    同様の問題に悩んでたところ、こちらのスレッドと重複してたので、続いて質問させてください。

    既存の静的なhtmlサイトを、wp2.7で構築したサイトにリニューアルしようとしています。

    index.htmlなどhtmlサイトを公開したままの状態で、同じくルート階層にwpをインストールし、ドメイン/index.phpにアクセスしてwpサイトの最終動作確認をしたいと思っておりますが、officegilbertoさんと同様、index.phpにアクセスしても、ドメイン/ にリダイレクトされhtmlサイトが表示されてしまいます。
    (wpをインストールしたデフォルトの状態でも)

    wp2.5の時にはこの方法で、index.htmlを残したまま、index.phpにも問題なくアクセスしwpサイトを確認できたのですが、バージョン2.7の仕様?なのかリダイレクトされてしまいます。

    DirectoryIndex index.php index.html
    とすれば、index.phpが優先されるのは分かりますが、それではリニューアル前の最終確認はできません。

    どなた様か、2.7でも、index.htmlを残したまま、index.php(wpサイト)を表示させる方法をご存知ないでしょうか。

    どうぞ宜しくお願いいたします。

    モデレーター jim912

    (@jim912)

    keysさん、こんにちは。

    とりあえずの表示確認であれば、wp-includes/canonical.phpの208行目

    $redirect['path'] = preg_replace('|/index.php/*?$|', '/', $redirect['path']);

    をコメントアウトするとindex.phpのまま表示されるようになります。あるいは、286行目にredirect_canonicalというフックがありますので、プラグインでの実装も可能です。

    ただ、WordPressルートへのリンクは変わらないので一方通行的になってしまいますが。

    jim912さん、こんにちは
    いつも的確なお答えをありがとうございます。

    wp-includes/canonical.phpの208行目をコメントアウト
    で解決できました。

    完璧です。ありがとうございました。

    しかし自分の知識レベルを完全に超えているので、別の疑問が湧いてきました。
    なぜこのように、ここを治せば解決できるとお分かりになったのでしょうか‥
    どうやったら、原因がwp-includesフォルダの中のcanonical.phpファイルの中の208行目にあるなんて見つけられるのでしょう‥
    [redirect] とか、それらしきキーワードでWordPressファイル全体を検索するのでしょうか?

    少しでもWordPressを理解する為には、原因を見つけるスキルが重要だと痛感しました。
    そのスキルが付けば一つ上のランクに上がれるような気がしました。

    jim912さん、どうかそのヒントみたいな物でもお教え頂けませんでしょうか。
    お忙しい中たいへん恐縮ですが、どうぞ宜しくお願いいたします!

    モデレーター IKEDA Yuriko

    (@lilyfan)

    どうやったら、原因がwp-includesフォルダの中のcanonical.phpファイルの中の208行目にあるなんて見つけられるのでしょう‥

    これは WordPress のソースコードをある程度読むことが必要ですね。index.html → index.php という変換 (Canonical URL 機能) は canonical.php で実現しているので、このソースを読めば、どこかは当たりがつきます。

    元質問ですが、元の静的ページ自体も WordPress で提供する手があります。home.php というテンプレートを用意するか、固定ページをフロントページ (トップページ) にすると、希望の動作になるでしょう。

    lilyfanさん、ありがとうございます。

    index.html → index.php という変換を、(Canonical URL 機能)と言う
    って事を知っていなければ、canonical.phpまでたどりつけないですね。
    これはWordPress以前の問題でしょうか‥

    ん〜奥が深すぎる。。
    日々精進ですね。

    モデレーター jim912

    (@jim912)

    keysさん、こんにちは。

    index.html → index.php という変換を、(Canonical URL 機能)と言う
    って事を知っていなければ、canonical.phpまでたどりつけないですね。

    まあ、細かい間違いはおいといて。。。

    私自身は、それほど練熟しているわけではなく、canonical.phpも今回辿り着くまではほとんど開いたこともありません。今回の回答については、かなりベタですが、以下のような感じで見つけています。

    1. 実行ロジックの中で、だいたいのあたりをつけ、exit;を割り込ませて、リダイレクトが実行されるポイントを割り出す
    2. そのポイントで行われているソースを追う。
    3. 対応策を検討する。

    ちなみに、WordPressの実行ロジックの大元は、index.phpの次に読み込まれるwp-blog-header.phpの

    require_once( dirname(__FILE__) . '/wp-load.php' );
    
    	wp();
    
    	require_once( ABSPATH . WPINC . '/template-loader.php' );

    3行で、

    require_once( dirname(__FILE__) . '/wp-load.php' );

    が、wp-config.php、wp-settings.phpを読み込み、初期設定や必要なファイルの読み込みを行います。

    wp();

    は、リクエストされたURLを元に、データベースへのクエリーを生成し、該当する投稿・ページを抽出・変数へのセットを行います。

    require_once( ABSPATH . WPINC . '/template-loader.php' );

    は、名前からも想像つきますが、テーマのテンプレートを読み込み、表示を司る部分です。

    今回は、おそらくURLのパース時あたりで行うのではないかと考え、まずはwp();内の各所でexit;させてみるも、ハズレでここではリダイレクト前のままです。

    かと言って、テンプレートが読み込まれてレンダリングが始まってしまうとheaderによるリダイレクトは出来ませんから、この間と言うことになります。

    で、さらに絞り込んでいくとtemplate-loader.phpの

    do_action('template_redirect');

    というフックでリダイレクトが行われることが分かります。

    では、デフォルトのフックが登録されるdefault-filter.phpから実行関数がたどれるかと思いきや、このファイルに記述されているwp_old_slug_redirectという関数は全く違うもの。

    他にこのフックで行われているものがあるはずなので、フックを管理・記憶している$wp_filterという変数をvar_dumpで表示させてみると、もう1つredirect_canonicalという関数がフックされていることが分かります。

    で、あとは、この関数の記述されている場所を探し出して、ソースを読み、対応策を導き出すだけです。

    $wp_filterであったり、WordPressがどのように起動して実行されていくかなどは、プラグインを作ったりすると、ソースを読むことが必須になるため、自然と覚えていく(経験と検索(爆)で)ものと思います。

    jim912さん、いや、jim912師匠と勝手に呼ばせていただきます(笑)

    非常に詳しく解説いただきありがとうございます。
    こういった、発想の手順を教えて頂くのは本当にありがたいです。

    しかし正直なところ、ここまで詳しく解説いただいてもレベルが高すぎて理解しきれない部分が多いですが、少しづつでも壁を乗り越えていきたいと意欲が湧いてきます。
    貴重なご説明ありがとうございました。

    まだまだ未熟ですが、今後ともよろしくお願いします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「同じディレクトリにindex.phpとindex.htmlを混在させる」には新たに返信することはできません。