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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

0回答

227閲覧

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

chef

総合スコア15

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2019/03/06 01:51

編集2019/03/06 05:01

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/03/06 02:53

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

2019/03/06 03:04 編集

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

2019/03/06 03:40

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

2019/03/06 04:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問