質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.79%

WordPressでhtaccessファイルを使って記事ページだけリダイレクトさせるには?

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,214

score 15

こんにちは。お世話になります。
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の記述方法が知りたいです。

これが今回私がお聞きしたいことです。

質問というか、確認というか、みなさまのご意見などいただければ嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • CHERRY

    2019/03/06 11:53

    > 想定した動作になりませんでした。

    だけではどのような動作を期待しているのかわからないので、テストした具体的な URI の例と 質問に記載した .htaccess での実際の動作、希望する動作を数例記載していただけないでしょうか?

    キャンセル

  • chef

    2019/03/06 12:02 編集

    基本的には特定の記事の時に処理(リダイレクト)されますが、問題点の通り、ディレクト構造によって処理されないケースがあります。
    その代表例がディレクトの名称が「category」と「tag」の時で、理由はアーカイブページを除外するために記述している否定形のRewriteCondがあるからです。
    そのため、RerwiteBaseでディレクト名を明示すれば良いのかなと思ったのですが、相変わらず処理されませんでした。
    希望する動作は「RewriteCondeで指定した特定の記事(アーカイブページやトップページを除く)だけでリダイレクト」されることです。

    キャンセル

  • ockeghem

    2019/03/06 12:40

    CHERRYさんが書いているように、具体的なURL(入力)と、期待する結果、実際の結果を「ありのままに」書いてください

    キャンセル

  • chef

    2019/03/06 13:49

    質問の仕方が悪く申し訳ないです。記事に追記しました。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る