こんにちは。お世話になります。
WordPressのリダイレクト処理について質問があります。
PHPでhtaccessファイルに動的にリダイレクト命令を記述するプログラムを作っているのですが、特定の条件下での記述内容でつまづいています。
前提
- wp_redirect関数などを使わずに、htaccessファイルで処理をしたいです。
- オリジナルテーマに組み込むプログラムのため、パーマリンク構造など制御できない部分があります。
- localhost/wordpressディレクトリ、localhost/categoryディレクトリでそれぞれテストしています。
処理内容
環境変数%{REQUEST_URI}を使って、URLの最後が条件と一致するページだけリダイレクトする処理を記述していました。
以下が記述内容の例です。(開発環境のため302リダイレクトにしています)
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ./hello-world/?$ [OR] RewriteCond %{REQUEST_URI} ./wordpress/?$ [OR] RewriteCond %{REQUEST_URI} ./category/?$ RewriteCond %{REQUEST_URI} !/category/. RewriteRule .* http://example.com%{REQUEST_URI} [R=302,L] </IfModule>
- カテゴリーページなら除外
- パーマリンクの最後にスラッシュがあってもなくてもリダイレクト
- サブディレクトリなら除外(サブディレクトリじゃないページでリダイレクト)
など、色々考えた結果このような記述内容にしてみました。
RewriteBase /category/
といった記述も試してみましたが、htaccessの処理内容を私が勘違いしているのか想定した動作(categoryディレクト以下だけ対象に処理を実行)になりませんでした。
問題点
- そもそものコードがスマートじゃない気がします。(環境変数使い回さずに条件定義した方がいいとか)
- サブディレクトリの名前が「category」の場合に処理できません。(同じ理由で「tag」ディレクトの時も処理できません)
- その他のアーカイブページ(例えばタグなど)も否定の条件(!/tag/.)を追加しないといけないので、スマートじゃない気がします。
お知恵をお借りしたいこと
- もっと完結なやり方があれば教えていただきたいです。
- 今回のような条件でもすべてクリアするような記述、もしくはそのヒントを教えていただきたいです。
追記① 実行結果
質問内容に不備があったため追記します。
今回のコードでは以下の実行結果を得られます。
上がアクセスするページ、下がアクセスした後の結果です。
【ケース①成功:記事ページにアクセス】 http://origin.com/wordpress http://example.com/wordpress 【ケース②成功:カテゴリーアーカイブページにアクセス】 http://origin.com/category/wordpress http://origin.com/category/wordpress 【ケース③成功:記事ページにアクセス】 http://origin.com/category http://example.com/category 【ケース④成功:記事ページにアクセス】 http://origin.com/wordpress/wordpress http://example.com/wordpress/wordpress ※サブディレクトの名称が「wordpress」で、WordPressのスラッグを持つ記事にアクセス 【ケース⑤失敗:記事ページにアクセス】 http://origin.com/category/wordpress http://origin.com/category/wordpress ※サブディレクトリの名称が「category」で、WordPressのスラッグを持つ記事にアクセス
追記② 自己解決の可能性
こちらのページを参考に以下のコードにしてみたところ確かめられる範囲で成功しています。
編集箇所は最後のRewriteCondです。否定の先読みというものを試してみました。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ./hello-world/?$ [OR] RewriteCond %{REQUEST_URI} ./wordpress/?$ [OR] RewriteCond %{REQUEST_URI} ./category/?$ RewriteCond %{REQUEST_URI} (?!/category/.) RewriteRule .* http://example.com%{REQUEST_URI} [R=302,L] </IfModule>
これでサブディレクトの名称が「category」でも処理されたので、先述のケース⑤も成功ということになります。
追記③ お聞きしたいこと
質問の仕方が悪かったようなので、簡潔に。
「~~パーマリンク構造やディレクト構造に影響されない、~~記事だけを対象にしたリダイレクト処理の汎用的な記述の仕方は何でしょうか?」
【追記】パーマリンク構造やディレクト構造に影響されない…というと語弊があると思うので追記します。今回の質問内容がWordPressに関することなので、WordPressの構造で汎用的に使えるhtaccessの記述方法が知りたいです。
これが今回私がお聞きしたいことです。
質問というか、確認というか、みなさまのご意見などいただければ嬉しいです。
あなたの回答
tips
プレビュー