На сайте при выполнении определенных условий в УРЛ категории подставляется название города, чтобы получить посадочные страницы категорий под разные города.
Например, категория https://site.ru/ru/torty - категория города https://site.ru/GOROD/ru/torty
Столкнулись с такой проблемой. Страница в УРЛ которой язык по умолчанию https://site.ru/GOROD/ru/torty - отдает код сервера 200, а страницы других языковых версий - отдают код сервера 404…
Например, https://site.ru/GOROD/en/torty или https://site.ru/GOROD/uk/torty
Может это и НЕ связано с языком по умолчанию в УРЛ, но вот такая вот беда…
Как понять, почему страницы отдают код 404, если на сайте страница открывается и на ней все отображается как нужно…
Напишите, пожалуйста, какой алгоритм действий вы бы порекомендовали использовать, чтобы понять почему страницы отдают код 404 вместо кода 200, чтобы можно было найти ту часть кода и исправить. Спасибо
Программист написал что на 95% проблема в этой части кода, может тут вы что-то увидите что может вызывать проблему:
Спойлер
function fn_app_get_route(&$req, $result, $area, &$is_allowed_url)
{
if (empty($_POST) && empty($req["is_ajax"]) && empty($_SESSION['ab__seo_data']) && fn_get_request_uri($_SERVER['ORIGINAL_REQUEST_URI']) !== fn_get_request_uri($_SERVER['REQUEST_URI'])) {
fn_redirect($_SERVER['REQUEST_URI']);
}
if (!empty($req["dispatch"]) and $req["dispatch"] == "_no_page" && $area = 'C' && empty(Registry::get('app_seo_domain'))) {
$server_uri = $_SERVER['REQUEST_URI'];
$uri = fn_get_request_uri($server_uri);
if (!empty($uri)) {
$frontend_default_language = Registry::get('settings.Appearance.frontend_default_language');
$show_secondary_language_in_uri = YesNo::toBool(Registry::get('addons.seo.seo_language'));
$use_single_seo_name = YesNo::toBool(Registry::get('addons.seo.single_url'));
$requested_language = null;
$uri_path_parts = [];
list($path) = explode('?', $uri);
if ($path) {
$uri_path_parts = explode('/', $path);
$uri_path_parts = array_values(array_filter($uri_path_parts, function ($part) {
return $part !== '';
}));
}
$language_in_uri = null;
if (!empty($uri_path_parts)) {
static $valid_languages;
if ($valid_languages !== null) {
return $valid_languages;
}
$valid_languages = AppRegistry::getOrSetCache(
'seo_active_languages',
['languages', 'storefronts_languages'],
['static', 'company'],
static function () {
return Languages::getActive();
}
);
$lang_code_candidate = reset($uri_path_parts);
if (isset($valid_languages[$lang_code_candidate])) {
$language_in_uri = $lang_code_candidate;
}
}
$is_requested_language_in_path = false;
if ($language_in_uri && $show_secondary_language_in_uri) {
$requested_language = $language_in_uri;
$is_requested_language_in_path = true;
}
if (isset($req['sl'])) {
$requested_language = $req['sl'];
}
if ($show_secondary_language_in_uri && $requested_language === $frontend_default_language) {
if ($is_requested_language_in_path) {
$uri = fn_seo_remove_language_from_uri($uri);
}
unset($req['sl']);
$redirect_url = trim(Registry::get('config.current_location'), '/') . $uri;
if ($req) {
$redirect_url .= '?' . http_build_query($req);
}
$result = [
INIT_STATUS_REDIRECT,
$redirect_url,
false,
true,
];
return;
}
$rewrite_rules = fn_get_rewrite_rules();
foreach ($rewrite_rules as $pattern => $query) {
if (
!preg_match($pattern, $uri, $matches)
&& !preg_match($pattern, urldecode($query), $matches)
) {
continue;
}
$_query = preg_replace('!^.+\\?!', '', $query);
parse_str($_query, $objects);
$result_values = 'matches';
foreach ($objects as $key => $value) {
preg_match('!^.+\[([0-9])+\]$!', $value, $_id);
$objects[$key] = (strpos($value, '$') === 0) ? ${$result_values}[$_id[1]] : $value;
if ($key === 'sl'){
}
}
if (!empty($objects) && !empty($objects['object_name'])) {
preg_match('!^([^\/]+)\/([a-z]+)!', $matches[2], $_matches);
if (!empty($_matches[1])){
$matches[2] = $_matches[2];
$objects['object_name'] = rtrim($objects['object_name'], '/');
if (!empty($matches[2]) && $matches[2] === $objects['sl']){
Registry::set('app_seo_domain', $_matches[1]);
$r_uri = &$_SERVER['REQUEST_URI'];
$r_uri = str_replace("/" . $_matches[1] . '/', "/", $uri);
$req = array();
fn_seo_get_route($req, $result, $area, $is_allowed_url);
break;
}
}
}
}
}
}
}