ページ名と同名のフォルダがある場合の処理
-
こんにちは。お世話になります。
wordpressの固定ページで、ページ名「test」というページを作ったとします。
その場合、アドレスはhttp://example.com/test となりますが、
同名のフォルダ「test」が存在した場合、ページが表示されず、フォルダの中身を見に行ってしまいます。これを、フォルダの中身を見に行かず、wordpressの固定ページの方を見に行くようにするにはどうすればよいのでしょうか?
index.php を置いてwordpressの方に制御を移す、という感じだと思うのですが、そのやり方などお教えいただけると助かります。
よろしくお願いします!
-
ページ作成画面で、パーマリンクを指定する場所があるので
そこですでに存在するフォルダ名と違うのを指定してあげれば良いのでは・・・と思うんですが。
ご質問の意味を取り違えていたらスミマセン。.htaccessに記述される
RewriteCond %{REQUEST_FILENAME} !-d
という記述は、フォルダ(dはディレクトリの意)が無ければ(index.phpへ処理を渡す)、という指定ですので、これを削除すれば、フォルダが実在した場合でも、アクセス可能になるかと思います。
これを削除すれば、フォルダが実在した場合でも、アクセス可能になるかと思います。
削除しちゃダメです。パーマリンクが機能しなくなって、他のページにアクセス不能になります。
WordPress のパーマリンク機構は、「アクセスされた URI が存在しないファイル/ディレクトリーに対するものだった場合に WordPress コアが URI を解釈して対応するコンテンツを出す」という仕組みです。したがって、test ディレクトリーが存在する場合はそれが表示されてしまい、パーマリンクで指定した test ページは表示されません。
もし、”!-d” の行を削除してしまうと、存在しないディレクトリーに対するコンテンツを表示する、という動作ができなくなってしまいます。つまり、年/月/日/カテゴリー/タグ/作成者アーカイブや固定ページが表示できないという事態が予想されます。
したがって、webmori365 さんがおっしゃる通り、パーマリンクもしくはディレクトリーのどちらかの名前を変更するのが一番簡単です。
ただし、http://example.com/test/ という URL に対しては固定ページを見せたいが、http://example.com/test/image.jpg というファイルは実体を見せたい、という場合は名前を変更する手は使えません。かわりに、 .htaccess に次のブロックを追加すれば OK です。(RewriteBase, RewriteRule の部分は適宜調整が必要です)
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} /test/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php [L] </IfModule>
みなさん、ご回答ありがとうございます!
●webmori365さん
そこですでに存在するフォルダ名と違うのを指定してあげれば良いのでは・・・と思うんですが。
全くその通りなのですが、すでにフォルダ名・ページ名ともに決定しており、これを動かせないような状況です。。。
●jim912さん
ご回答ありがとうございます。
ただ、せっかくご回答いただいたのですが、うまくいかないような感じでした・・・。●lilyfanさん
ご回答ありがとうございます。ただし、http://example.com/test/ という URL に対しては固定ページを見せたいが、http://example.com/test/image.jpg というファイルは実体を見せたい、という場合・・・
そうなんです、まさしくこのようなケースでして。。。(T_T)
お教えいただいたように.htaccessを修正してみたのですが、うまくいきませんでした・・・。
こちらの設定ミスでしょうか??(ルートディレクトリの.htaccessを変更したのですが、もしかして、testディレクトリの中に新たに.htaccessを作って・・・ということでしょうか?)
この方法でlilyfanさんの環境ではうまく実現できますか~?お教えいただいたように.htaccessを修正してみたのですが、うまくいきませんでした・・・。
修正じゃなくて追加です。最初からある .htaccess の内容はそのままで、もう1つ追加するということです。あと、RewriteBase, RewriteRule の部分は環境によって違うので、適宜調整が必要です (元からある .htaccess の内容をマネる)。
あと、提示案は、/test/ ディレクトリーがルート直下にあるという前提なので、それも適宜調整してください。
この方法でlilyfanさんの環境ではうまく実現できますか~?
ローカルでのテストはバッチリです。ローカルでは URL が http://localhost/~lily/wp/27/ という感じなので、.htaccess も以下のようになります。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /~lily/wp/27/ RewriteCond %{REQUEST_URI} /~lily/wp/27/test/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /~lily/wp/27/index.php [L] </IfModule>
●lilyfanさん
ご返信ありがとうございます!(何度もすいませんm(_ _)m)lilyfanさんがおっしゃるように追加していたのですが、やはりうまくいかないようです。。。サーバー環境によっても違うんでしょうか??
ルートに置いているので、以下のように書いています。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} /test/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php [L] </IfModule>
IEでは、
『Web ページへのナビゲーションは取り消されました』
のエラーメッセージが、Firefoxでは
『自動転送がループしています。
このアドレスへのリクエストに対するサーバの自動転送設定がループしています。』
のメッセージがでます。サーバーはロリポップ、エックスサーバーで検証しましたが、どちらもダメでした(T_T)
もしできなければ最終的にはフォルダの名前を変えるしかないか、と思っているのですが、できれば変えずにいきたいので、なんとか原因がわかると嬉しいです。。。
このアドレスへのリクエストに対するサーバの自動転送設定がループしています。』
うーん。ちょっと変ですね。
追加する順序でも違ってくるんですが、元の設定の後に追加していますか?それでもダメならば、元の記述において、明示的に test ディレクトリーを除外させた方がいいかもしれません。つまり、
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !/test/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] RewriteCond %{REQUEST_URI} /test/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php [L] </IfModule>
という感じですね。これは元の htaccess も含めて置き換えてしまってください。
この場合、WordPress のパーマリンク設定を変更すると、.htaccess が書き変わってしまう可能性があるので、パーミッションを調整して、644 とか、他人への書き込み権限を外しておいてください。
●lilyfanさん
早速のご返信、ありがとうございます!
追加する順序でも違ってくるんですが、元の設定の後に追加していますか?
はい、後に追加しています。。。
これは元の htaccess も含めて置き換えてしまってください。
これも置き換えて試してみましたが、やはりエラーメッセージは同じ・・・。
うまくいきませんでした(T_T)お手数をおかけするのも申し訳ないので、潔く諦めて、ページかフォルダの名前を変更する方向で調整してみます。
ありがとうございました!!ただ、ちょっと「なぜできないのか?」「他に方法はあるのか?」というところで、もやっとする部分がありますので、気が向いたら&お時間があったらで結構です、なにか思いつかれたら追記いただけると嬉しく思いますm(__)m
●lilyfanさん
フィードバックありがとうございます。勉強になります。●onさん
ご苦労なされているようですね。
参考程度に、私の環境ですと下記の記述で問題なく表示されています。<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^/wp-admin/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php [L] </IfModule>
もし、mod_rewiteの記述でうまくいかず、なおかつ実在するフォルダが多くないのであれば、最初にお考えいただいていたように、実在フォルダ内にindex.phpを置いて対処する方がベストでしょうか。。。
このindex.phpはWordPressを設置するフォルダのindex.phpをコピーして、
require('./wp-blog-header.php');
の階層を合わせてあげれば、動作するかと思います。
これも置き換えて試してみましたが、やはりエラーメッセージは同じ・・・。
うーん。なんか挙動が不可思議ですね。Apache のバージョンはいくつですか? あと、サーバー OS の名称/ディストリビューションおよびバージョンはいくつでしょう。
RewriteRule に L 指定があるので、ループが発生するとなると、書換え後の URL (index.php) にアクセスできていないという現象だと思います。index.php の実体にアクセスできてないので、また rewrite が発生してループする、という感じです。
したがって、RewriteBase, RewriteRule の記述を見直すか、index.php が消えてないかを確認してみてください。実は WordPress がドキュメントルートにインストールされてないとか?? (その場合は RewriteBase が違ってきます)
返信遅くなりすいません!!
●jim912さん
丁寧なご返信ありがとうございます!
そちらでは.htaccessの変更でうまくいっているんですね。
となると、こちらの設定の仕方が間違っている、という可能性が高そうですね・・・
もう一度試してみたいと思います!●lilyfanさん
何度もありがとうございます!
こうやってご返信いただけるとwordpressを使っていて心強く思えます!サーバーは、3つほどサーバーを借りているので、それぞれで試してみましたが、それでもうまくいきませんでしたので、特定のサーバーの影響、というものではなさそうです。
index.php が消えてないかを確認してみてください。実は WordPress がドキュメントルートにインストールされてないとか??
index.phpもありますし、ドキュメントルートにインストールはしています。
なので、ここはクリアしていると思うのですが・・・。
jim912さんも成功しているとのことですし、もう一度、今までの回答を読ませていただいて、試してみたいと思います!
ありがとうございました!!サーバーは、3つほどサーバーを借りているので、それぞれで試してみましたが、それでもうまくいきませんでしたので、特定のサーバーの影響、というものではなさそうです。
その3つが同じ設定である可能性はあるので、それぞれの PHP, Apache のバージョンおよび php.ini の記述を確認してみてください。
- トピック「ページ名と同名のフォルダがある場合の処理」には新たに返信することはできません。