Exemple #1
0
 /**
  * Page を初期化する.
  *
  * @return void
  */
 function init()
 {
     $this->template = MAIN_FRAME;
     //IP制限チェック
     $allow_hosts = unserialize(ADMIN_ALLOW_HOSTS);
     if (is_array($allow_hosts) && count($allow_hosts) > 0) {
         if (array_search($_SERVER["REMOTE_ADDR"], $allow_hosts) === FALSE) {
             SC_Utils_Ex::sfDispError(AUTH_ERROR);
         }
     }
     //SSL制限チェック
     if (ADMIN_FORCE_SSL == TRUE) {
         if (SC_Utils_Ex::sfIsHTTPS() === false) {
             SC_Response_Ex::sendRedirect($_SERVER["REQUEST_URI"], $_GET, FALSE, TRUE);
         }
     }
     $this->tpl_authority = $_SESSION['authority'];
     // ディスプレイクラス生成
     $this->objDisplay = new SC_Display_Ex();
     // プラグインクラス生成
     $this->objPlagin = new SC_Helper_Plugin_Ex();
     $this->objPlagin->preProcess($this);
     // トランザクショントークンの検証と生成
     $this->doValidToken(true);
     $this->setTokenTo();
 }
Exemple #2
0
 /**
  * Page を初期化する.
  *
  * @return void
  */
 function init()
 {
     $this->template = MAIN_FRAME;
     //IP制限チェック
     $allow_hosts = unserialize(ADMIN_ALLOW_HOSTS);
     if (is_array($allow_hosts) && count($allow_hosts) > 0) {
         if (array_search($_SERVER['REMOTE_ADDR'], $allow_hosts) === FALSE) {
             SC_Utils_Ex::sfDispError(AUTH_ERROR);
         }
     }
     //SSL制限チェック
     if (ADMIN_FORCE_SSL == TRUE) {
         if (SC_Utils_Ex::sfIsHTTPS() === false) {
             SC_Response_Ex::sendRedirect($_SERVER['REQUEST_URI'], $_GET, FALSE, TRUE);
         }
     }
     $this->tpl_authority = $_SESSION['authority'];
     // ディスプレイクラス生成
     $this->objDisplay = new SC_Display_Ex();
     // スーパーフックポイントを実行.
     $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
     $objPlugin->doAction('LC_Page_preProcess', array($this));
     // トランザクショントークンの検証と生成
     $this->doValidToken(true);
     $this->setTokenTo();
     // ローカルフックポイントを実行
     $parent_class_name = get_parent_class($this);
     $objPlugin->doAction($parent_class_name . '_action_before', array($this));
     $class_name = get_class($this);
     if ($class_name != $parent_class_name) {
         $objPlugin->doAction($class_name . '_action_before', array($this));
     }
 }
 /**
  *
  * {@inheritDoc}
  *
  * @see LC_Page::process()
  */
 function process()
 {
     if (ADMIN_FORCE_SSL && SC_Utils_Ex::sfIsHTTPS() === false) {
         SC_Response_Ex::reloadSSL();
         SC_Response_Ex::actionExit();
     }
     GC_Utils_Ex::gfPrintLog(print_r($_SESSION, true), DEBUG_LOG_REALFILE);
     GC_Utils_Ex::gfPrintLog(print_r($_COOKIE, true), DEBUG_LOG_REALFILE);
     GC_Utils_Ex::gfPrintLog(print_r($_SERVER, true), DEBUG_LOG_REALFILE);
     GC_Utils_Ex::gfPrintLog(print_r($_ENV, true), DEBUG_LOG_REALFILE);
     parent::process();
     $this->action();
     $this->sendResponse();
 }
Exemple #4
0
 function sfIsSuccess($objSess, $disp_error = true)
 {
     $ret = $objSess->IsSuccess();
     if ($ret != SUCCESS) {
         if ($disp_error) {
             // エラーページの表示
             SC_Utils_Ex::sfDispError($ret);
         }
         return false;
     }
     // リファラーチェック(CSRFの暫定的な対策)
     // 「リファラ無」 の場合はスルー
     // 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する
     if (empty($_SERVER['HTTP_REFERER'])) {
         // TODO 警告表示させる?
         // sfErrorHeader('>> referrerが無効になっています。');
     } else {
         $domain = SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL;
         $pattern = sprintf('|^%s.*|', $domain);
         $referer = $_SERVER['HTTP_REFERER'];
         // 管理画面から以外の遷移の場合はエラー画面を表示
         if (!preg_match($pattern, $referer)) {
             if ($disp_error) {
                 SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR);
             }
             return false;
         }
     }
     return true;
 }
 /**
  * アプリケーション内でリダイレクトする
  *
  * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち)
  * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING']
  * 2. $location に含まれる searchpart
  * 3. 引数 $arrQueryString
  * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。
  * @param array $arrQueryString URL に付加する searchpart
  * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか
  * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承
  * @return void
  * @static
  */
 function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null)
 {
     // ローカルフックポイント処理
     $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
     $arrBacktrace = debug_backtrace();
     if (is_object($arrBacktrace[0]['object']) && method_exists($arrBacktrace[0]['object'], 'getMode')) {
         $parent_class_name = get_parent_class($arrBacktrace[0]['object']);
         $objPlugin->doAction($parent_class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($arrBacktrace[0]['object']));
         $class_name = get_class($arrBacktrace[0]['object']);
         if ($class_name != $parent_class_name) {
             $objPlugin->doAction($class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($this));
         }
     } elseif (is_object($arrBacktrace[0]['object'])) {
         $pattern = '/^[a-zA-Z0-9_]+$/';
         $mode = null;
         if (isset($_GET['mode']) && preg_match($pattern, $_GET['mode'])) {
             $mode = $_GET['mode'];
         } elseif (isset($_POST['mode']) && preg_match($pattern, $_POST['mode'])) {
             $mode = $_POST['mode'];
         }
         $parent_class_name = get_parent_class($arrBacktrace[0]['object']);
         $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object']));
         $class_name = get_class($arrBacktrace[0]['object']);
         if ($class_name != $parent_class_name) {
             $objPlugin->doAction($class_name . '_action_' . $mode, array($this));
         }
     }
     // url-path → URL 変換
     if ($location[0] === '/') {
         $netUrl = new Net_URL($location);
         $location = $netUrl->getUrl();
     }
     // URL の場合
     if (preg_match('/^https?:/', $location)) {
         $url = $location;
         if (is_bool($useSsl)) {
             if ($useSsl) {
                 $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/';
                 $replacement = HTTPS_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             } else {
                 $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/';
                 $replacement = HTTP_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             }
         }
     } else {
         if (!is_bool($useSsl)) {
             $useSsl = SC_Utils_Ex::sfIsHTTPS();
         }
         $netUrl = new Net_URL($useSsl ? HTTPS_URL : HTTP_URL);
         $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location;
         $url = $netUrl->getUrl();
     }
     $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/';
     // アプリケーション外へのリダイレクトは扱わない
     if (preg_match($pattern, $url) === 0) {
         trigger_error('', E_USER_ERROR);
     }
     $netUrl = new Net_URL($url);
     if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) {
         $arrQueryStringBackup = $netUrl->querystring;
         // XXX メソッド名は add で始まるが、実際には置換を行う
         $netUrl->addRawQueryString($_SERVER['QUERY_STRING']);
         $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup);
     }
     $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString);
     $session = SC_SessionFactory_Ex::getInstance();
     if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) {
         $netUrl->addQueryString(session_name(), session_id());
     }
     $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken());
     $url = $netUrl->getURL();
     header("Location: {$url}");
     exit;
 }
Exemple #6
0
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
$require_php_dir = realpath(dirname(__FILE__));
require_once $require_php_dir . "/define.php";
require_once $require_php_dir . HTML2DATA_DIR . "require_base.php";
// 携帯端末の場合は mobile 以下へリダイレクトする。
if (SC_MobileUserAgent::isMobile()) {
    $url = "";
    if (SC_Utils_Ex::sfIsHTTPS()) {
        $url = MOBILE_SSL_URL;
    } else {
        $url = MOBILE_SITE_URL;
    }
    if (preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['REQUEST_URI'], $matches)) {
        $path = $matches[1];
    } else {
        $path = '';
    }
    header("Location: " . SC_Utils_Ex::sfRmDupSlash($url . $path));
    exit;
}
Exemple #7
0
 /**
  * アプリケーション内でリダイレクトする
  *
  * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち)
  * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING']
  * 2. $location に含まれる searchpart
  * 3. 引数 $arrQueryString
  * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。
  * @param array $arrQueryString URL に付加する searchpart
  * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか
  * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承
  * @return void
  * @static
  */
 function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null)
 {
     // url-path → URL 変換
     if ($location[0] === '/') {
         $netUrl = new Net_URL($location);
         $location = $netUrl->getUrl();
     }
     // URL の場合
     if (preg_match('/^https?:/', $location)) {
         $url = $location;
         if (is_bool($useSsl)) {
             if ($useSsl) {
                 $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/';
                 $replacement = HTTPS_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             } else {
                 $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/';
                 $replacement = HTTP_URL . '\\1';
                 $url = preg_replace($pattern, $replacement, $url);
             }
         }
     } else {
         if (!is_bool($useSsl)) {
             $useSsl = SC_Utils_Ex::sfIsHTTPS();
         }
         $netUrl = new Net_URL($useSsl ? HTTPS_URL : HTTP_URL);
         $netUrl->path = dirname($_SERVER['PHP_SELF']) . '/' . $location;
         $url = $netUrl->getUrl();
     }
     $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/';
     // アプリケーション外へのリダイレクトは扱わない
     if (preg_match($pattern, $url) === 0) {
         SC_Utils_Ex::sfDispException();
     }
     $netUrl = new Net_URL($url);
     if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) {
         $arrQueryStringBackup = $netUrl->querystring;
         // XXX メソッド名は add で始まるが、実際には置換を行う
         $netUrl->addRawQueryString($_SERVER['QUERY_STRING']);
         $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup);
     }
     $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString);
     $session = SC_SessionFactory::getInstance();
     if (SC_MobileUserAgent_Ex::isMobile() || $session->useCookie() == false) {
         $netUrl->addQueryString(session_name(), session_id());
     }
     $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken());
     $url = $netUrl->getURL();
     header("Location: {$url}");
     exit;
 }
 /**
  * オペレーションの実行権限をチェックする
  *
  * @param string オペレーション名
  * @param array リクエストパラメータ
  * @return boolean 権限がある場合 true; 無い場合 false
  */
 protected function checkOperationAuth($operation_name, &$arrParam, &$arrApiConfig)
 {
     if (SC_Utils_Ex::isBlank($operation_name)) {
         return false;
     }
     $arrAuthTypes = explode('|', $arrApiConfig['auth_types']);
     $result = false;
     foreach ($arrAuthTypes as $auth_type) {
         $ret = false;
         switch ($auth_type) {
             case self::API_AUTH_TYPE_REFERER:
                 $ret = SC_Api_Operation_Ex::checkReferer();
                 break;
             case self::API_AUTH_TYPE_SESSION_TOKEN:
                 $ret = SC_Helper_Session_Ex::isValidToken(false);
                 break;
             case self::API_AUTH_TYPE_API_SIGNATURE:
                 $ret = SC_Api_Operation_Ex::checkApiSignature($operation_name, $arrParam, $arrApiConfig);
                 break;
             case self::API_AUTH_TYPE_CUSTOMER:
                 $ret = SC_Api_Operation_Ex::checkCustomerAccount($arrParam['login_email'], $arrParam['login_password']);
                 break;
             case self::API_AUTH_TYPE_MEMBER:
                 $ret = SC_Api_Operation_Ex::checkMemberAccount($arrParam['member_id'], $arrParam['member_password']);
                 break;
             case self::API_AUTH_TYPE_CUSTOMER_LOGIN_SESSION:
                 $objCustomer = new SC_Customer_Ex();
                 $ret = $objCustomer->isLoginSuccess();
                 break;
             case self::API_AUTH_TYPE_MEMBER_LOGIN_SESSION:
                 $ret = SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex(), false);
                 break;
             case self::API_AUTH_TYPE_IP:
                 $ret = SC_Api_Operation_Ex::checkIp($operation_name);
                 break;
             case self::API_AUTH_TYPE_HOST:
                 $ret = SC_Api_Operation_Ex::checkHost($operation_name);
                 break;
             case self::API_AUTH_TYPE_SSL:
                 $ret = SC_Utils_Ex::sfIsHTTPS();
                 break;
             case self::API_AUTH_TYPE_OPEN:
                 $result = true;
                 break 2;
                 // foreachも抜ける
             // foreachも抜ける
             default:
                 $ret = false;
                 break;
         }
         if ($ret === true) {
             $result = true;
         } else {
             $result = false;
             break;
             // 1つでもfalseがあれば,その時点で終了
         }
     }
     return $result;
 }
Exemple #9
0
 /**
  * $path から URL を取得する.
  *
  * 以下の順序で 引数 $path から URL を取得する.
  * 1. realpath($path) で $path の 絶対パスを取得
  * 2. $_SERVER['DOCUMENT_ROOT'] と一致する文字列を削除
  * 3. $useSSL の値に応じて, SITE_URL 又は, SSL_URL を付与する.
  *
  * 返り値に, QUERY_STRING を含めたい場合は, key => value 形式
  * の配列を $param へ渡す.
  *
  * @access protected
  * @param string $path 結果を取得するためのパス
  * @param array $param URL に付与するパラメータの配列
  * @param mixed $useSSL 結果に SSL_URL を使用する場合 true,
  *                         SITE_URL を使用する場合 false,
  *                         デフォルト "escape" 現在のスキーマを使用
  * @return string $path の存在する http(s):// から始まる絶対パス
  * @see Net_URL
  */
 function getLocation($path, $param = array(), $useSSL = "escape")
 {
     $rootPath = $this->getRootPath($path);
     // スキーマを定義
     if ($useSSL === true) {
         $url = SSL_URL . $rootPath;
     } elseif ($useSSL === false) {
         $url = SITE_URL . $rootPath;
     } elseif ($useSSL == "escape") {
         if (SC_Utils_Ex::sfIsHTTPS()) {
             $url = SSL_URL . $rootPath;
         } else {
             $url = SITE_URL . $rootPath;
         }
     } else {
         die("[BUG] Illegal Parametor of \$useSSL ");
     }
     $netURL = new Net_URL($url);
     // QUERY_STRING 生成
     foreach ($param as $key => $val) {
         $netURL->addQueryString($key, $val);
     }
     return $netURL->getURL();
 }
Exemple #10
0
 /**
  * 現在の URL を取得する
  *
  * @return string 現在のURL
  */
 function sfGetUrl()
 {
     $url = '';
     if (SC_Utils_Ex::sfIsHTTPS()) {
         $url = "https://";
     } else {
         $url = "http://";
     }
     $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '?' . $_SERVER['QUERY_STRING'];
     return $url;
 }
Exemple #11
0
 function send_err_mail($result, $sql)
 {
     $url = '';
     $errmsg = '';
     if (SC_Utils_Ex::sfIsHTTPS()) {
         $url = "https://";
     } else {
         $url = "http://";
     }
     $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     $errmsg = $url . "\n\n";
     $errmsg .= "SERVER_ADDR:" . $_SERVER['SERVER_ADDR'] . "\n";
     $errmsg .= "REMOTE_ADDR:" . $_SERVER['REMOTE_ADDR'] . "\n";
     $errmsg .= "USER_AGENT:" . $_SERVER['HTTP_USER_AGENT'] . "\n\n";
     $errmsg .= $sql . "\n";
     $errmsg .= $result->message . "\n\n";
     $errmsg .= $result->userinfo . "\n\n";
     $arrRbacktrace = array_reverse($result->backtrace);
     foreach ($arrRbacktrace as $backtrace) {
         if ($backtrace['class'] != "") {
             $func = $backtrace['class'] . "->" . $backtrace['function'];
         } else {
             $func = $backtrace['function'];
         }
         $errmsg .= $backtrace['file'] . " " . $backtrace['line'] . ":" . $func . "\n";
     }
     require_once CLASS_EX_PATH . "page_extends/error/LC_Page_Error_SystemError_Ex.php";
     $objPage = new LC_Page_Error_SystemError_Ex();
     register_shutdown_function(array($objPage, "destroy"));
     $objPage->init();
     $objPage->process();
     if (DEBUG_MODE == true) {
         print '<pre>';
         print_r(htmlspecialchars($errmsg, ENT_QUOTES, CHAR_CODE));
         print '</pre>';
     }
     GC_Utils_Ex::gfPrintLog($errmsg);
     exit;
 }
Exemple #12
0
 /**
  * ホスト名を正規化する
  *
  * @return void
  */
 public function normalizeHostname()
 {
     if (!USE_NORMALIZE_HOSTNAME || !isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_METHOD'] === 'POST') {
         // 処理せず戻る
         return;
     }
     $netUrlRequest = new Net_URL($_SERVER['REQUEST_URI']);
     // 要求を受けたホスト名
     $request_hostname = $netUrlRequest->host;
     $netUrlCorrect = new Net_URL(SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL);
     // 設定上のホスト名
     $correct_hostname = $netUrlCorrect->host;
     // ホスト名が不一致の場合
     if ($request_hostname !== $correct_hostname) {
         // ホスト名を書き換え
         $netUrlRequest->host = $correct_hostname;
         // 正しい URL
         $correct_url = $netUrlRequest->getUrl();
         // 警告
         $msg = 'ホスト名不一致を検出。リダイレクト実行。';
         $msg .= '要求値=' . var_export($request_hostname, true) . ' ';
         $msg .= '設定値=' . var_export($correct_hostname, true) . ' ';
         $msg .= 'リダイレクト先=' . var_export($correct_url, true) . ' ';
         trigger_error($msg, E_USER_WARNING);
         // リダイレクト(恒久的)
         SC_Response_Ex::sendHttpStatus(301);
         SC_Response_Ex::sendRedirect($correct_url);
     }
 }
 /**
  * アプリケーション内でリダイレクトする
  *
  * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち)
  * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING']
  * 2. $location に含まれる searchpart
  * 3. 引数 $arrQueryString
  *
  * @param string $location
  *            「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。
  * @param array $arrQueryString
  *            URL に付加する searchpart
  * @param bool $inheritQueryString
  *            現在のリクエストの searchpart を継承するか
  * @param bool|null $useSsl
  *            true:HTTPSを強制, false:HTTPを強制, null:継承
  * @return void
  * @static
  *
  */
 public function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null)
 {
     // ローカルフックポイント処理
     $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
     if (is_object($objPlugin)) {
         $arrBacktrace = debug_backtrace();
         if (is_object($arrBacktrace[0]['object'])) {
             $pattern = '/^[a-zA-Z0-9_]+$/';
             if (isset($_REQUEST['mode']) && preg_match($pattern, $_REQUEST['mode'])) {
                 $mode = $_REQUEST['mode'];
             }
             $parent_class_name = get_parent_class($arrBacktrace[0]['object']);
             $class_name = get_class($arrBacktrace[0]['object']);
         }
         $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object']));
         if ($class_name != $parent_class_name) {
             $objPlugin->doAction($class_name . '_action_' . $mode, array($this));
         }
     }
     // url-path → URL 変換
     if ($location[0] === '/') {
         $netUrl = new Net_URL($location);
         $url = $netUrl->getUrl();
     } elseif (strpos($location, HTTPS_URL) === 0 || strpos($location, HTTP_URL) === 0) {
         $url = $location;
     } else {
         $netUrl = new Net_URL(HTTP_URL);
         $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location;
         $url = $netUrl->getUrl();
     }
     if (!is_bool($useSsl)) {
         $useSsl = SC_Utils_Ex::sfIsHTTPS();
     }
     if ($useSsl) {
         $url = str_replace(HTTP_URL, HTTPS_URL, $url);
     } else {
         $url = str_replace(HTTPS_URL, HTTP_URL, $url);
     }
     // アプリケーション外へのリダイレクトは扱わない
     if (!SC_Utils_Ex::isAppInnerUrl($url)) {
         trigger_error('URL IS APP NOT INNER URL', E_USER_ERROR);
     }
     $netUrl = new Net_URL($url);
     if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) {
         $arrQueryStringBackup = $netUrl->querystring;
         // XXX メソッド名は add で始まるが、実際には置換を行う
         $netUrl->addRawQueryString($_SERVER['QUERY_STRING']);
         $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup);
     }
     $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString);
     $session = SC_SessionFactory_Ex::getInstance();
     if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) {
         $netUrl->addQueryString(session_name(), session_id());
     }
     if (GC_Utils_Ex::isAdminFunction()) {
         // 管理画面またはmode指定時は付与
         $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken());
     }
     $url = $netUrl->getURL();
     header("Location: {$url}");
     exit;
 }