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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

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

Q&A

解決済

1回答

1502閲覧

RewriteRuleでのマッチした文字列の取得方法

manabunbun

総合スコア39

Apache

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

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

0グッド

0クリップ

投稿2017/07/18 07:44

.htaccessで以下のようにアドレスをRewriteして、php側で処理しています。

http://172.16.16.117/tanto/tantomenu/ RewriteRule ([^/]*)\/([^/]*)\/$ http://172.16.16.117/index.php?control=$1&action=$2 [L]

php

1if ($this->get['control'] && $this->get['action']) { 2 array_push($this->params,$this->get['control'],$this->get['action']); 3}

これにパターンにマッチした文字列をもう一つ増やして

http://172.16.16.117/tanto/tantomenu/1/ RewriteRule ([^/]*)\/([^/]*)\/([^/]*)\/$ http://172.16.16.117/index.php?control=$1&action=$2&param3=$3 [L] RewriteRule ([^/]*)\/([^/]*)\/$ http://172.16.16.117/index.php?control=$1&action=$2 [L]

php

1//3つ目のパラメーターが存在するとき。 2if (isset($this->get['param3'])) { 3 array_push($this->params,$this->get['control'],$this->get['action'],$this->get['param3']); 4}

という風にパラメータを増やして取得したいのですが、
Array ( [0] => tanto [1] => tantomenu [2] => tanto [3] => tantomenu [4] => 1 )
といった具合でうまく取得できません。

グループの回数で振分が出来ればいいような気がしますが、何か良い方法がありますでしょうか。
全く別の方法でも構いません。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Array ( [0] => tanto [1] => tantomenu [2] => tanto [3] => tantomenu [4] => 1 )

これは

php

1array_push($this->params,$this->get['control'],$this->get['action'],$this->get['param3']);

この出力結果ですか?
$this->paramsのほうに、index0とindex1が入っていて、index2〜4で$this->get['control']〜$this->get['param3']が入っているということで合ってますか?

合っていれば、ちゃんと取得できていると思いますが・・・。

もしかして、PHPのソースは以下のようになっていますか?
最初のソースと2番目のソースは続けて書いてあるようなイメージですか?

php

1if ($this->get['control'] && $this->get['action']) { 2 array_push($this->params,$this->get['control'],$this->get['action']); 3} 4//3つ目のパラメーターが存在するとき。 5if (isset($this->get['param3'])) { 6 array_push($this->params,$this->get['control'],$this->get['action'],$this->get['param3']); 7}

これの出力結果が

Array ( [0] => tanto [1] => tantomenu [2] => tanto [3] => tantomenu [4] => 1 )

であれば納得です。

その上で、3つめのパラメータが存在するときには、

php

1//3つ目のパラメーターが存在するとき。 2if (isset($this->get['param3'])) { 3 array_push($this->params,$this->get['control'],$this->get['action'],$this->get['param3']); 4

これだけ実行させて、

Array ( [0] => tanto [1] => tantomenu [2] => 1)

という配列を作りたいので、その方法は何かないか?ということを聞いているでしょうか?

そうであれば、以下のようにすれば回避できると思います。

php

1//3つ目のパラメーターが存在するとき。 2if (isset($this->get['param3'])) { 3 array_push($this->params,$this->get['control'],$this->get['action'],$this->get['param3']); 4}else{//3つ目がないとき。 5 array_push($this->params,$this->get['control'],$this->get['action']); 6 7} 8

param3が存在するときには、RewiteRule上必ずcontrolとactionがあります。
逆にparam3が存在しないときには、2つ目のRewiteRuleでリクエストが飛んできたということなので、
最初にparam3のifを定義しておいて、その他のパターンということでelseで記述する形です。

質問の意図が違いましたら、すみません。

投稿2017/07/18 12:04

Iya712

総合スコア158

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

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

manabunbun

2017/07/19 02:17

Iya712さんご回答ありがとうございました。RewriteRuleの正規表現が間違っているとずっと思いこんでいました。初歩的な間違いでした。 ありがとうございました。
Iya712

2017/07/19 04:57

意図どおりの回答だったようでよかったです! 今仕事で、RewriteCond や RewriteRuleを使ったリダイレクトをやっていたので、私も参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問