/** * Page のレスポンス送信. * * @return void */ public function sendResponse() { // ループ防止に現在URLを格納 $location = ''; $netUrl = new Net_URL(); $location = $netUrl->getUrl(); // ログインされていなく、リダイレクト処理 if (empty($this->isLogin) && !preg_match('/^.*original.*/', $location)) { $this->objDisplay->response->sendRedirect('original'); } $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg); // ローカルフックポイントを実行. $this->doLocalHookpointAfter($objPlugin); // HeadNaviにpluginテンプレートを追加する. $objPlugin->setHeadNaviBlocs($this->arrPageLayout['HeadNavi']); // スーパーフックポイントを実行. $objPlugin->doAction('LC_Page_process', array($this)); // ページクラス名をテンプレートに渡す $arrBacktrace = debug_backtrace(); if (strlen($this->tpl_page_class_name) === 0) { $this->tpl_page_class_name = preg_replace('/_Ex$/', '', $arrBacktrace[1]['class']); } $this->objDisplay->prepare($this); $this->objDisplay->addHeader('Vary', 'User-Agent'); $this->objDisplay->response->write(); }
/** * アプリケーション内でリダイレクトする * * 内部で生成する 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; }
/** * 新着情報を取得する * * @param SC_Query $objQuery DB操作クラス * @return array $arrNews 取得結果を配列で返す */ function lfGetNews(&$objQuery) { $col = ""; $col .= "news_id "; // 新着情報ID $col .= ",news_title "; // 新着情報タイトル $col .= ",news_comment "; // 新着情報本文 $col .= ",news_date "; // 日付 $col .= ",news_url "; // 新着情報URL $col .= ",news_select "; // 新着情報の区分(1:URL、2:本文) $col .= ",(SELECT shop_name FROM dtb_baseinfo limit 1) AS shop_name "; // 店名 $col .= ",(SELECT email04 FROM dtb_baseinfo limit 1) AS email "; // 代表Emailアドレス $from = "dtb_news"; $where = "del_flg = '0'"; $order = "rank DESC"; $objQuery->setOrder($order); $arrNews = $objQuery->select($col, $from, $where); // RSS用に変換 foreach (array_keys($arrNews) as $key) { $netUrlHttpUrl = new Net_URL(HTTP_URL); $row =& $arrNews[$key]; // 日付 $row['news_date'] = date('r', strtotime($row['news_date'])); // 新着情報URL if (SC_Utils_Ex::isBlank($row['news_url'])) { $row['news_url'] = HTTP_URL; } elseif ($row['news_url'][0] == '/') { // 変換(絶対パス→URL) $netUrl = new Net_URL($row['news_url']); $netUrl->protocol = $netUrlHttpUrl->protocol; $netUrl->user = $netUrlHttpUrl->user; $netUrl->pass = $netUrlHttpUrl->pass; $netUrl->host = $netUrlHttpUrl->host; $netUrl->port = $netUrlHttpUrl->port; $row['news_url'] = $netUrl->getUrl(); } } return $arrNews; }
/** * Returns the current request URL * * @return string Current request URL * @access public */ function getUrl() { return empty($this->_url)? '': $this->_url->getUrl(); }
/** * アプリケーション内でリダイレクトする * * 内部で生成する 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; }
/** * 新着情報を取得する * * @return array $arrNews 取得結果を配列で返す */ public function lfGetNews() { $objNews = new SC_Helper_News_Ex(); $arrNews = $objNews->getList(); $objDb = new SC_Helper_DB_Ex(); $arrInfo = $objDb->sfGetBasisData(); // RSS用に変換 foreach (array_keys($arrNews) as $key) { $netUrlHttpUrl = new Net_URL(HTTP_URL); $row =& $arrNews[$key]; $row['shop_name'] = $arrInfo['shop_name']; $row['email'] = $arrInfo['email04']; // 日付 $row['news_date'] = date('r', strtotime($row['news_date'])); // 新着情報URL if (SC_Utils_Ex::isBlank($row['news_url'])) { $row['news_url'] = HTTP_URL; } elseif ($row['news_url'][0] == '/') { // 変換(絶対パス→URL) $netUrl = new Net_URL($row['news_url']); $netUrl->protocol = $netUrlHttpUrl->protocol; $netUrl->user = $netUrlHttpUrl->user; $netUrl->pass = $netUrlHttpUrl->pass; $netUrl->host = $netUrlHttpUrl->host; $netUrl->port = $netUrlHttpUrl->port; $row['news_url'] = $netUrl->getUrl(); } } return $arrNews; }
Server.....: <?php echo $url->host; ?> Port.......: <?php echo $url->port; ?> File/path..: <?php echo $url->path; ?> Querystring: <?php print_r($url->querystring); ?> Anchor.....: <?php echo $url->anchor; ?> Full URL...: <?php echo $url->getUrl(); ?> </pre> </body> </html>
/** * ホスト名を正規化する * * @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; }
/** * 新着情報を取得する * * @return array $arrNews 取得結果を配列で返す */ public function lfGetNews() { /* @var $objNews NewsHelper */ $objNews = Application::alias('eccube.helper.news'); $arrNews = $objNews->getList(); /* @var $objDb DbHelper */ $objDb = Application::alias('eccube.helper.db'); $arrInfo = $objDb->getBasisData(); // RSS用に変換 foreach (array_keys($arrNews) as $key) { $netUrlHttpUrl = new \Net_URL(HTTP_URL); $row =& $arrNews[$key]; $row['shop_name'] = $arrInfo['shop_name']; $row['email'] = $arrInfo['email04']; // 日付 $row['news_date'] = date('r', strtotime($row['news_date'])); // 新着情報URL if (Utils::isBlank($row['news_url'])) { $row['news_url'] = HTTP_URL; } elseif ($row['news_url'][0] == '/') { // 変換(絶対パス→URL) $netUrl = new \Net_URL($row['news_url']); $netUrl->protocol = $netUrlHttpUrl->protocol; $netUrl->user = $netUrlHttpUrl->user; $netUrl->pass = $netUrlHttpUrl->pass; $netUrl->host = $netUrlHttpUrl->host; $netUrl->port = $netUrlHttpUrl->port; $row['news_url'] = $netUrl->getUrl(); } } return $arrNews; }