通常のURLからSSLに移動を行いたいときなど、LC_Page::sendRedirect()にURLを渡せば自動的にセッションIDを付加した上で転送を行ってくれます。
ところが転送先URLに
hoge.php?id=100
とか書いても、転送先では$_REQUEST['id']を取得できなかったりします(取得できる場合もある)。
転送先URLの作成などはPear::Net_URLを使用しています。
URLにセッションID等を付加する処理は以下のようになっています。
どこが問題なのかというと、ここです。
単にURLにリクエストパラメータを追加しているようにしか見えませんが、実はNet_URL::addRawQueryString()は「追加」ではなく「上書き」です。
ちなみに同じような名前のNet_URL::addQueryString()は追加です。
なにこの罠。
従って、何かひとつでもリクエストパラメータがあった場合にLC_Page::sendRedirect($url)を使用すると、$urlに引き渡したGETパラメータは全て消え失せてしまいます。
これはNet_URLのバグだと思うのですが中の人はバグじゃないとか言っています。
だったら名前どうにかしろよと。
仕方ないのでこちらでどうにかしましょう。
できました。
EC-CUBEの記事
ところが転送先URLに
hoge.php?id=100
とか書いても、転送先では$_REQUEST['id']を取得できなかったりします(取得できる場合もある)。
転送先URLの作成などはPear::Net_URLを使用しています。
URLにセッションID等を付加する処理は以下のようになっています。
1
2
3
4
5
6
7
8
9
|
$netURL = new Net_URL($url);
if (!empty($_SERVER['QUERY_STRING'])) {
$netURL->addRawQueryString($_SERVER['QUERY_STRING']);
}
$session = SC_SessionFactory::getInstance();
if ($isMobile || $session->useCookie() == false) {
$netURL->addQueryString(session_name(), session_id());
}
$netURL->addQueryString(TRANSACTION_ID_NAME, $this->getToken());
|
どこが問題なのかというと、ここです。
1
2
3
|
if (!empty($_SERVER['QUERY_STRING'])) {
$netURL->addRawQueryString($_SERVER['QUERY_STRING']);
}
|
単にURLにリクエストパラメータを追加しているようにしか見えませんが、実はNet_URL::addRawQueryString()は「追加」ではなく「上書き」です。
ちなみに同じような名前のNet_URL::addQueryString()は追加です。
なにこの罠。
従って、何かひとつでもリクエストパラメータがあった場合にLC_Page::sendRedirect($url)を使用すると、$urlに引き渡したGETパラメータは全て消え失せてしまいます。
これはNet_URLのバグだと思うのですが中の人はバグじゃないとか言っています。
だったら名前どうにかしろよと。
仕方ないのでこちらでどうにかしましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
function sendRedirect($url, $isMobile = false ) {
$netURL = new Net_URL($url);
//GETパラメータを保存しておく
$queryStringArray=$netURL->querystring;
//今までの処理
if (!empty($_SERVER['QUERY_STRING'])) {
$netURL->addRawQueryString($_SERVER['QUERY_STRING']);
}
$session = SC_SessionFactory::getInstance();
if ($isMobile || $session->useCookie() == false) {
$netURL->addQueryString(session_name(), session_id());
}
$netURL->addQueryString(TRANSACTION_ID_NAME, $this->getToken());
//GETパラメータを追加
if(is_array($queryStringArray)){
foreach($queryStringArray as $key=>$val){
$netURL->addQueryString($key, $val);
}
}
//リダイレクト
header("Location: " . $netURL->getURL());
exit();
}
|
できました。
EC-CUBEの記事
PR
トラックバック
トラックバックURL: