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

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

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

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Q&A

1回答

2700閲覧

クエリ文字列が複数ある場合の.htaccessを使用したmod_rewriteでの301リダイレクト先の出し分け

mm-mm

総合スコア2

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

1クリップ

投稿2019/08/13 08:35

編集2019/08/13 08:42

やりたいこと

検索フォームでクエリパラメーターを複数送信した場合、
URLの重複を避けるために、URLを301Redirecrtしたいのですが、個別のパラメーターごとにリダイレクトしたいです。

たとえば、example.com/hoge/?a=AA&b=BB&c=CC

というパラメーターのURLが合った場合、

例1.

example.com/hoge/?a=foo&b=&c=

a=foo
b= (空)
c= (空)
の場合は
example.com/foo/に301リダイレクトで転送

例2.

example.com/hoge/?a=bar&b=&c=

a=bar
b= (空)
c= (空)

の場合は
example.com/bar/に301リダイレクトで転送

例3.

example.com/hoge/?a=hogehoge&b=foo&c=bar

a=hogehoge
b=foo
c=bar

の場合には
example.com/hogehoge-foo-bar/に301リダイレクトで転送

というように、複数のクエリ文字列を分岐させてリダイレクト先をそれぞれ設定したいです。

パラメーターごとの飛び先は手動で書いてもいいので、数が多くなってしまってもいいのですが
まず、

  • 複数のクエリパラメーターの取得
  • 各クエリパラメーター毎に条件分岐

の仕方がわかりません。

うまく行かなかった内容

まず、例1の場合のみを想定して試しに以下のように書いてみたのですが、動きませんでした。

[code]
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)a=([^&]+)($|&)
RewriteRule .* - [E=X_A:%2]
RewriteCond %{QUERY_STRING} (^|&)b=([^&]+)($|&)
RewriteRule .* - [E=X_B:%2]
RewriteCond %{QUERY_STRING} (^|&)c=([^&]+)($|&)
RewriteRule .* - [E=X_C:%2]

RewriteRule /hoge/ /{ENV:X_QUERY_HOGE}/ [R=301,L]
[/code]

お手数おかけしますが、どなたかおわかりになる方、教えていただければと思います。

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

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

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

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

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

otn

2019/08/13 08:40

例2の記述、間違えてませんか?
mm-mm

2019/08/13 08:43

おっしゃる通りでした。 修正いたしました。 よろしくお願いします
guest

回答1

0

こんな感じでどうでしょうか?

Apache

1RewriteEngine on 2RewriteCond %{QUERY_STRING} (^|&)a=(.*?)($|&) 3RewriteRule ^hoge/$ - [E=X_A:%2] 4RewriteCond %{QUERY_STRING} (^|&)b=(.*?)($|&) 5RewriteRule ^hoge/$ - [E=X_B:%2] 6RewriteCond %{QUERY_STRING} (^|&)c=(.*?)($|&) 7RewriteRule ^hoge/$ - [E=X_C:%2] 8RewriteCond %{ENV:X_A} .+ 9RewriteCond %{ENV:X_B} ^$ 10RewriteCond %{ENV:X_C} ^$ 11RewriteRule ^hoge/$ /%{ENV:X_A}/? [R=301] 12RewriteCond %{ENV:X_A} .+ 13RewriteCond %{ENV:X_B} .+ 14RewriteCond %{ENV:X_C} ^$ 15RewriteRule ^hoge/$ /%{ENV:X_A}-%{ENV:X_B}/? [R=301]

以下同様に、
(・aだけが空で無いケース)記述済み
・bだけが空で無いケース
・cだけが空で無いケース
(・aとbが空で無いケース)記述済み
・aとcが空で無いケース
・bとcが空で無いケース
・aとbとcが空で無いケース
・全部空のケース
を記述すれば良いかと思います。

投稿2019/08/13 14:33

otn

総合スコア84529

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

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

otn

2019/08/13 22:24

> になるってことですよね? いいえ。https://example.com/AA/ です。 > 試してみたんですけど、動かなかったです .htaccess をドキュメントルートに置いていますか?
mm-mm

2019/08/15 03:03

失礼いたしました、URLは僕が記載間違えました。 .htaccessはルートにおいてます。 Redirect 301 ○ ○ は効くので、設置場所は間違っていないかと思います。 考えられる理由はありますでしょうか?
otn

2019/08/15 03:05

^hoge/$ の部分を全部 ^ だけにしたらどうですか?
mm-mm

2019/08/16 01:16

うーん、リダイレクトされないですね…
otn

2019/08/17 12:52

もういちど、よく見直しましょう。 初心者にありがちなのは、「自分は間違っていないのに結果がおかしい」と思い込んでしまうことです。 結果がおかしいので、どこか間違っているに違いないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問