Magento 1.6.1 - Удалить из корзины перенаправления на домашнюю страницу (с запущенным Varnish) - PullRequest
1 голос
/ 13 марта 2012

У меня действительно странная проблема с Magento 1.6.1.

У нас есть 3 платформы: DEV, TST, LIVE (текущий активный веб-сайт).

Мы также запускаем Varnish перед сайтом.

Проблема в том, что на сайте LIVE при удалении чего-либо (с помощью кнопки удаления) из корзины вы всегда перенаправляетесь на домашнюю страницу. Если вы удаляете предметы, устанавливая их количество на 0, тогда это нормально.

Эта проблема не возникает в одной и той же кодовой базе DEV или TST.

Может ли это быть как-то мешающий Лак? Какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вы используете Varnish на сайтах разработчиков и разработчиков? Это не похоже на вас.

Я предполагаю, что в вашем модуле Varnish для Magento есть наблюдатель, который обнаружит, есть ли в корзине какое-либо содержимое (т. Е. Чтобы увидеть, есть ли у вас сеанс, уникальный для вас), но когда вы очищаете свою корзину, этот наблюдатель затем запускает заголовок nocache для Varnish, и Varnish возвращает новый ответ (кэшированный, не относящийся к cookie) и возвращает вас на домашнюю страницу.

Похоже, ваш модуль Varnish является причиной.

Удалите Varnish и связанный с ним модуль Magento, затем повторно протестируйте. Похоже, довольно простой способ исключить это.

0 голосов
/ 08 августа 2016

Одна вещь, которая поразила меня при настройке моей локальной среды для использования Varnish перед Nginx, заключалась в том, что перенаправления приложений начали действовать странно. Добавление продукта для сравнения из представления продукта перенаправило меня на базовый URL, а не обратно в представление продукта (реферер). Поэтому я начал копаться в ядре, чтобы посмотреть, что на самом деле происходит.

app/code/core/Mage/Core/Controller/Varien/Action.php:773

Метод _getRefererUrl ищет любой URL-адрес реферера в URI запроса или из заголовков запроса. По какой-то причине $refererUrl не прошел как _isUrlInternal, что заставляет его вернуться к базовому URL.

/**
 * Identify referer url via all accepted methods (HTTP_REFERER, regular or base64-encoded request param)
 *
 * @return string
 */
protected function _getRefererUrl()
{
    $refererUrl = $this->getRequest()->getServer('HTTP_REFERER');
    if ($url = $this->getRequest()->getParam(self::PARAM_NAME_REFERER_URL)) {
        $refererUrl = $url;
    }
    if ($url = $this->getRequest()->getParam(self::PARAM_NAME_BASE64_URL)) {
        $refererUrl = Mage::helper('core')->urlDecode($url);
    }
    if ($url = $this->getRequest()->getParam(self::PARAM_NAME_URL_ENCODED)) {
        $refererUrl = Mage::helper('core')->urlDecode($url);
    }

    $refererUrl = Mage::helper('core')->escapeUrl($refererUrl);

    if (!$this->_isUrlInternal($refererUrl)) {
        $refererUrl = Mage::app()->getStore()->getBaseUrl();
    }
    return $refererUrl;
}

app/code/core/Mage/Core/Controller/Varien/Action.php:799

Здесь Magento ищет позицию (базовый URL) строки http://domain.com/ in (URL-адрес реферера) http://domain.com:8080/any/url.html,, которая никогда не будет найдена из-за номера порта, который прослушивал Nginx (позади Varnish).

/**
 * Check url to be used as internal
 *
 * @param   string $url
 * @return  bool
 */
protected function _isUrlInternal($url)
{
    if (strpos($url, 'http') !== false) {
        /**
         * Url must start from base secure or base unsecure url
         */
        if ((strpos($url, Mage::app()->getStore()->getBaseUrl()) === 0)
            || (strpos($url, Mage::app()->getStore()->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK, true)) === 0)
        ) {
            return true;
        }
    }
    return false;
}

app/code/core/Mage/Core/Helper/Url.php:37

Этот номер порта (по какой-то странной причине) добавляется при построении текущего URL в Magento.

/**
 * Retrieve current url
 *
 * @return string
 */
public function getCurrentUrl()
{
    $request = Mage::app()->getRequest();
    $port = $request->getServer('SERVER_PORT');
    if ($port) {
        $defaultPorts = array(
            Mage_Core_Controller_Request_Http::DEFAULT_HTTP_PORT,
            Mage_Core_Controller_Request_Http::DEFAULT_HTTPS_PORT
        );
        $port = (in_array($port, $defaultPorts)) ? '' : ':' . $port;
    }
    $url = $request->getScheme() . '://' . $request->getHttpHost() . $port . $request->getServer('REQUEST_URI');
    return $url;
}

Повторная работа переадресации

Без изменения приложения ваш веб-сервер (Nginx) должен прослушивать порт 80 (или 443), сохраняя при этом Varnish перед ним. Это можно сделать с помощью iptables.

...