Одна вещь, которая поразила меня при настройке моей локальной среды для использования 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.