Заголовок состояния 404, когда переменная URL-адреса перезаписи содержит% 2F для экранирования косой черты

Я создал веб-сайт wordpress, который динамически отображает один из примерно 400 тысяч продуктов, передавая 2 переменных запроса на страницу WP, на которой есть мой собственный шаблон php. Я использую WPML для перевода своих страниц, и я включил опцию сохранения URL-переменных _brand и _sku. Все отлично работает с этой настройкой (отображает страницы и заголовок состояния 200 ok). Переключатель языка также сохраняет переменные моих запросов.

URL-адрес выглядит так: domain.com/en/products/?_brand=JCB&_sku=01%2F117903

однако, поскольку я хочу, чтобы URL-адрес отображался как domain.com/en/products/a-brand/a-sku, я добавил следующие правила перезаписи в файл functions.php моего ребенка.

function rewrite_products()
{
    //en
    add_rewrite_rule('^products/([^&]+)/([^&]+)', 'index.php?page_id=93837&_brand=$matches[1]&_sku=$matches[2]', 'top');
    //nl
    add_rewrite_rule('^producten/([^&]+)/([^&]+)', 'index.php?page_id=93871&_brand=$matches[1]&_sku=$matches[2]', 'top');
    //fr
    add_rewrite_rule('^produits/([^&]+)/([^&]+)', 'index.php?page_id=93875&_brand=$matches[1]&_sku=$matches[2]', 'top');
    //de
    add_rewrite_rule('^produkte/([^&]+)/([^&]+)', 'index.php?page_id=93876&_brand=$matches[1]&_sku=$matches[2]', 'top');
    //es
    add_rewrite_rule('^productos/([^&]+)/([^&]+)', 'index.php?page_id=93877&_brand=$matches[1]&_sku=$matches[2]', 'top');
}

add_action('init', 'rewrite_products');

function rewrite_product_tags()
{
    add_rewrite_tag('%_brand%', '([^&]+)');
    add_rewrite_tag('%_sku%', '([^&]+)');
}
add_action('init', 'rewrite_product_tags', 10, 0);

Теперь я могу перейти по нужному URL-адресу и получить ту же страницу с правильным продуктом, однако заголовок теперь показывает 404 в качестве статуса.

Переключатель языка WPML также отбрасывает переменные моего запроса и просто перенаправляет /products/a-brand/a-sku, например, на /producten (перевод /products).

но самое главное, статус заголовка 404 не позволяет мне индексировать мои страницы, которые я выгрузил в карту сайта (около 2 миллионов URL-адресов), поскольку Google считает, что URL-адреса являются 404-ми, и не индексирует их. Напротив, это огромная проблема.

Я свел это к следующей проблеме:

  • я использую rawurlencode, который меняет символы, такие как / в артикуле до %2F
  • это приводит к тому, что заголовок будет 404
  • JCB/005549646Z/ этот URL работает отлично (отображает хороший и хороший заголовок)
  • JCB/01%2F117903/ отображается нормально, но имеет заголовок 404

настройка заголовка в шаблоне не работает. Мое регулярное выражение неверно? любая помощь приветствуется!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
284
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что ошибка была связана с ядром WordPress или где-то в моей родительской теме. В любом случае, я так и не нашел решения, только обходной путь для замены %2F на !2F при кодировании строк.

//Custom encoding en decoding to stop %2F 404 headers
function url_decode($encoded)
{
    $encoded = str_replace('!2F', '%2F', $encoded);
    $part_url = urldecode($encoded);

    return $part_url;
}

function url_encode($part_url)
{
    $encoded = rawurlencode($part_url);
    $encoded = str_replace('%2F', '!2F', $encoded);
    return $encoded;
}

Другие вопросы по теме