久々に投稿させていただきます。
下記2種類のURLにおいて、C%2B%2Bを引数に指定した場合、
上のURLでは、"C++"と表示されるのですが、
下のURLでは、"C "というようにプラス記号が半角スペースに
置き換わってしまいます。
どうすれば、同じ値が取得できるでしょうか?
http://hoge.com/index.php?test=C%2B%2B
http://hoge.com/C%2B%2B/
ファイルの内容です。
■.htaccess
RewriteEngine On
RewriteRule ^(.+)/$ index.php?cat=$1 [L]
■index.php
<?php
echo $_REQUEST["test"];
?>
宜しくお願いします。
実際に存在するんだよ。
他所様のURLを勝手に使うんじゃない!
>>1
ごもっともです。
以前、私もhoge.comを使ったときに実在することに気がついたので、
それからは
http://hoge.co.jp/
を使っています。
こういった例として存在しないURLを使うときには一度、チェックした方がいいでしょう。
大変失礼しました。
確かにURLチェックを事前に行うべきでした。
調べたところ、comドメインのルールは3文字以上ということなので、
今後はo.comとかを利用しようと思います。
PHPの文法はよく知らないので、PerlでQUERY_STRINGを表示させてみたところ、上記のURLはtest=C%2B%2Bで下記の方はcat=C++でした。
RewriteRuleのNEフラグの説明を読むと、URLエンコードをデコードするのが標準の動作みたいです。RewriteMapディレクティブを使えば書き換えもできますが、.htaccessでは無理ですね。
RewriteCondの後方参照を使うとか、環境変数を書き換えてみるとか、いろいろ試してみましたが、どれも上手くいきませんでした。
こういう仕様だと思って、PHPの方でフレキシブルに対応するのがよいのではないでしょうか?もしくはURLエンコードが必要なリクエストは書き換えないとか……。
すいません記述ミスがありました。
(訂正)RewriteRule ^(.+)/$ index.php?test=$1 [L]
かんなさん、素晴らしいヒントありがとうございました!
↓この方法で取得することができました。
echo rawurldecode($_SERVER['QUERY_STRING']);
ただし、test=C++の形式で取得できるので引数のみを抜き出す
加工は必要みたいです。
色々と検証までして下さって感謝しております。
ありがとうございました。
> 調べたところ、comドメインのルールは3文字以上ということなので、
1文字ドメインは存在しますし、1文字ドメインの開放を検討という話も
最近ありました。
http://www.nishishi.com/blog/2005/12/one_char_domain.html
なので、あらかじめ予約してある example.com などを使いましょう。