Имеется:
- пробная установка ocStore v1.0.1 релиз в раздел сайта (по урлу вида http://thesite.dom/teststore/)
- включены ЧПУ типа SeoPro
- заданы алиасы категориям и товарам
- .htaccess содержит обычное
...
RewriteEngine On
RewriteBase /teststore/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
...
При попытке перейти по ЧПУ-ссылке категории вида http://thesite.dom/teststore/testcategory/
получаем диагностику redirect loop в браузере, а апачев accesslog пишет что-то вроде:
"GET /teststore/testcategory/ HTTP/1.1" 301 -
"GET /teststore/testcategory/ HTTP/1.1" 301 -
"GET /teststore/testcategory/ HTTP/1.1" 301 -
"GET /teststore/testcategory/ HTTP/1.1" 301 -
"GET /teststore/testcategory/ HTTP/1.1" 301 -
...
и так много раз подряд.В файле catalog/controller/common/seo_pro.php за это ответственен такой участок кода:
class ControllerCommonSeoPro extends Controller {
...
skipped
...
private function validate($link) {
...
skipped
...
$seo_url = $this->url->link($this->request->get['route'], $args, $scheme);
$seo_url = str_replace('&', '&', $seo_url);
if ($link != rawurldecode(ltrim(parse_url($seo_url, PHP_URL_PATH), '/'))) { // <== вот тут не сработало условие
$get[] = 'route';
$data = array_diff_key($this->request->get, array_flip($get));
if (count($data)) {
$seo_url .= (strpos($seo_url, '?') === false) ? '?' : '&';
$seo_url .= urldecode(http_build_query($data));
}
header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
$this->response->redirect($seo_url);
}
}
}
У себя исправил так:
class ControllerCommonSeoPro extends Controller {
...
skipped
...
private function validate($link) {
...
skipped
...
$seo_url = $this->url->link($this->request->get['route'], $args, $scheme);
$seo_url = str_replace('&', '&', $seo_url);
$linkpfx = ltrim(parse_url($this->config->get('config_url'), PHP_URL_PATH), '/');
if ($linkpfx.$link != rawurldecode(ltrim(parse_url($seo_url, PHP_URL_PATH), '/'))) {
//if ($link != rawurldecode(ltrim(parse_url($seo_url, PHP_URL_PATH), '/'))) {
$get[] = 'route';
$data = array_diff_key($this->request->get, array_flip($get));
if (count($data)) {
$seo_url .= (strpos($seo_url, '?') === false) ? '?' : '&';
$seo_url .= urldecode(http_build_query($data));
}
header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
$this->response->redirect($seo_url);
}
}
}